强烈推荐记忆化搜索写法,好写,通用。
入门题:
hdoj 2089
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
HDOJ 3555
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
UESTC 1307
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
常见题型:
hdoj 3652
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
hdoj3709
这个题我是枚举的fix位,因为一个balance number不可能有俩个fix位,所以满足加法原理,不知道有没有更好的办法
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
hdoj 3271
数位DP+构造或者二分都可以
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
HDOJ 3967
枚举拆分位,由于这题算的是拆分种数,所以直接加和即可
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
HDOJ 3565
求由两个单峰数组成的数字中数位和最大的最大值,注意单峰数的定义,这题不满足区间减法,所以要同时要卡上界和下界(其实这种写法更加通用),state是上一位所在的状态,共有7种,0表示前导0,1表示第一个上升坡,2表示第一个顶点,3表示第一个下降坡,4表示第二个上升坡,5表示第二个顶点,6表示第二个下降坡.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
hdoj 3943
数位DP+二分或构造
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
hdoj 4389
table[len][i][j][k]表示剩余len位,f(x) = i,已经生成的前缀位%f(x)=j,生成的前缀位的数位和为k最后可以生成的合法数字个数.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
Codeforces 55D. Beautiful numbers
很明显的数位DP,但状态不好设计,开始想了一种很暴力的状态
table[len][state][r9][r8][r7][r6][r5][r4][r3][r2],表示剩余len位时,(1,2,...9)访问状态为state,已生成的前缀位%i = ri,最后可以得到的合法数字个数,但这复杂度O(18*256*9*8*7*6*5*4*3*2*9)太可观了。。。
后来发现状态r6,r4,r3,r2不是必要的,最后可以由其他状态推出来,可以省略掉,于是复杂度变成了O(18*256*9*8*7*5*9),还是略高,写好后交上去试了一下,3秒卡过
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
然后就是看题解了,其中应用了俩个性质
1 a = k*b, 则 (n%a)%b = n%b
2 如果 n如果能被 any(a1, a2, ...ak)整除,则有n能被lcm(a1, a2, ...ak)整除
因为lcm(2, 3, 4,...9) = 2520,所以应用这俩个性质就可以设计出一个不错的状态了
table[len][lc][k]表示剩余len位,前缀数位的lcm为lc,生成的前缀%2520为k最后可以得到的合法数字个数
看上去复杂度O(18*2520*2520*9)还是很高,但实际上由于2520的约数个数只有49个,所以lc可以的取值只有49个
这样复杂度就变成了O(18*49*2520*9),空间也可以用离散化压缩,嗯,这样就可以接受了。
题解上还给了一种更加优化的方法,但还不是很理解(果然数学是硬伤%>_<%)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
CODECHEF
Favourite Numbers
http://www.codechef.com/problems/FAVNUM
AC自动机+数位DP
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
Fast Bit Calculations lightoj 1032
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
BALNUM spoj10606
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
俩个回文数字题:
需要注意的是回文定义的状态还有无后效性(只对数字的前一半进行DP)
poj2402
http://poj.org/problem?id=2402
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
uestc1191
http://acm.uestc.edu.cn/problem.php?pid=1191
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include