首页 > 其他 > 详细

数位dp模板

时间:2014-04-21 09:08:02      阅读:420      评论:0      收藏:0      [点我收藏+]

通常的数位dp写法

bubuko.com,布布扣
int dfs(int i, int s, bool e) {
    if (i==-1) return s==target_s;
    if (!e && ~f[i][s]) return f[i][s];
    int res = 0;
    int u = e?num[i]:9;
    for (int d = first?1:0; d <= u; ++d)
        res += dfs(i-1, new_s(s, d), e&&d==u);
    return e?res:f[i][s]=res;
}
bubuko.com,布布扣

f为记忆化数组;

i为当前处理串的第i位(权重表示法,也即后面剩下i+1位待填数);

s为之前数字的状态(如果要求后面的数满足什么状态,也可以再记一个目标状态t之类,for的时候枚举下t);

e表示之前的数是否是上界的前缀(即后面的数能否任意填)。

for循环枚举数字时,要注意是否能枚举0,以及0对于状态的影响,有的题目前导0和中间的0是等价的,但有的不是,对于后者可以在dfs时再加一个状态变量z,表示前面是否全部是前导0,也可以看是否是首位,然后外面统计时候枚举一下位数。It depends.

以上参考自http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html

 

几道数位DP的题

CodeForces 55D Beautiful numbers

HDU 4352 XHXJ‘s LIS

ZOJ 3416 Balanced Number

HDU 3652 B-number

HDU 3555 Bomb

HDU 4734 F(x)

HDU 2089 不要62

HDU 4389 X mod f(x)

HDU 4507 吉哥系列故事――恨7不成妻

URAL 1057 Amount of Degrees

专题链接

数位dp模板,布布扣,bubuko.com

数位dp模板

原文:http://www.cnblogs.com/shangyu/p/3677241.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!