首页 > 其他分享 >数位DP

数位DP

时间:2023-02-01 20:33:23浏览次数:49  
标签:相同 后缀 DP now dp 数位

一、常见题面

  • 求两个数之间的满足特定条件的数的方案数(提高+/省选- 位数为\(10 ^ 6\);省选/NOI- 位数为\(10 ^{18}\)or有一些奇奇怪怪的操作)

例子:

待完善

  • 求两个数之间的满足特定条件的数并对数进行一定操作,得出答案

例子:

待完善

二、 算法详解

1. 本质

​ 将数按位进行拆分,进行记忆化搜索/DP递推的算法

2. 算法来源

​ 对于两个数(例子:1234533345),后缀(345)相同,且后缀所处”环境“下,相同部分的方案数相同,为避免重复计算相同后缀的方案,故有数位DP

3. 适用范围

  • 没有后效性

  • 后缀相同的情况下,后缀所对应的方案数相同

  • 数可拆分的性质

4.细节

​ 所有的数位dp非常的套路,一般的形式类似于\(dp[now][…][0/1]\)表示现在从高到低处理到了第\(now\)位,\(0/1\)表示是否顶上届,... 是每个题不同的状态设计

5. code

记忆化搜索:

int dfs(int now,……,bool low){
	if(now <= 0) return ……;//当前的数位
	if(~dp[now][……][low])return dp[now][……][low];//判断是否搜过
	int res = 0,top = low ? 9 : num[now];//确定枚举上界
	for(int i = 0; i <= top; ++i){
		res += dfs(now-1,……,low || i != top);
	}
	return dp[now][……][low] = res;
}
int solve(ll x){
	ll res = 0;
	if(x < 1e10) return 0;
	memset(dp,-1,sizeof(dp));
	for(len = 0; x; x /= 10)num[++len] = x % 10;//对上界进行拆分
	for(int i = 1; i <= num[len]; ++i)
		res += dfs(len-1,……,i < num[len]);
	return res;
}//预处理数组

递推:

//一开始dp初始化成0
//dp[1~n] 从高到低表示数
for(int now = 1; now <= n; ++cur){
	for(int j...){
		for(int lim = 0; lim < 2; ++lim){
			int up = lim ? num[now] : 9;
			for(int i = 0;i <= up; ++i)
				dp[now + 1][...][lim & (i == up)] += dp[now][...][lim];
		}
	}
}

三、如何从切蓝题到切紫题

你需要这些工具:

  • 矩阵加速递推:P2657 [SCOI2009] windy 数\(\Rightarrow\)[Sam数](P2106 Sam数)
  • 将一个数进行拆分的能力:SDOI2010]代码拍卖会
  • ……未完待续(因为本蒟蒻做的数位DP的紫题题不是很多,不能很好地概括,请原谅 (@^_^@))

标签:相同,后缀,DP,now,dp,数位
From: https://www.cnblogs.com/rickylin/p/17084085.html

相关文章

  • ThreadPoolExecutor线程池参数设置技巧
    一、ThreadPoolExecutor的重要参数1、corePoolSize:核心线程数*核心线程会一直存活,及时没有任务需要执行*当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建......
  • JavaFX 网格布局 GridPane
    packagefx.com;importjavafx.application.Application;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.scene.image.Image;importjavafx.......
  • 【YBT2023寒假Day3 A】千与千寻(期望DP)(高斯消元)
    千与千寻题目链接:YBT2023寒假Day3A题目大意一个n*m的平面,你要从(0,0)走到(x,y),你等概率的向上或向右走,然后当你走到(n-1,i)再往右走,就是(0,i),走到(i,m-1)再......
  • AT dp 26 题 题解
    题单:https://www.luogu.com.cn/training/100578#problems嘛虽然是26题,但是简单的题就不想写了...就写绿题及以上的吧目录EIJMOPQRSTUVE对重量dp,设\(dp[i][v]\)表......
  • NAPT网络结构下TCP/UDP/ICMP访问外网原理思考
    背景作为程序员,应该都听说过NAT(NetworkAddressTransfer,网络地址转换)这一技术名词,并或多或少大概知道其原理与作用--NAT是用于解决IPv4地址不够用,保证我们能够在IPv6普......
  • hdu:Two Rabbits(区间DP)
    ProblemDescriptionLonglongago,therelivedtworabbitsTomandJerryintheforest.Onasunnyafternoon,theyplannedtoplayagamewithsomestones.Th......
  • TCP协议与UDP协议的区别
    1、TCP面向连接(如打电话要先拨号建立连接);   UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重......
  • 【YBT2023寒假Day2 B】树上距离(分块)(LCA)(DP)
    树上距离题目链接:YBT2023寒假Day2B题目大意一棵树,边有边权,每次给出l,r,x,求x号点走到编号在l~r之间最近的点的距离。思路这题还有其它方法,比如线段树分治+线段树......
  • 黑苹果简单的手动开启显示器HiDPI教程
    原文链接:​​www.imacosx.cn/111522.html​​,查看最新版。转载请保留出处。先说个大概逻辑,就是让系统识别显示器,不管是one-key-hidpi还是hacintools,目的都一样,跟vendorID和p......
  • (AtCoder Beginner Contest 287)(D 字符串前后缀合并匹配)(E Trie求最长公共前缀(LCP)
    D-MatchorNot(字符串前后缀合并匹配)题目大意:给定两个字符串S和T,对于每个x=0,1,2...|T|求S的子串(前x个字符和后|T|-x个字符在不改变顺序的情况下组成)是否与T相......