您的位置:首页 > 其它

poj Round Numbers 3252(数位dp进阶)

2015-04-03 14:36 323 查看
题意:

统计区间内0的位数大于等于1的位数的二进制数。

ex:[1, 4]中有2(10), 4(100)

思路:

数位dp,f[pos][前面0的个数][前面1的个数]f[pos][前面0的个数][前面1的个数]是要记忆化的状态

int d[35], f[35][35][35];
// limit:是否达到上界
// nolead: 没有前导0
int dp (int pos, int limit, int nolead, int num0, int num1) {
if (pos < 0) return (nolead && num0 >= num1);
if (limit || f[pos][num0][num1] == -1) {
int last = limit ? d[pos] : 1, ret = 0;
for (int i=0;i<=last;++i) {
int nolead2 = nolead || i;
if (nolead2)
ret += dp (pos-1, limit && i == last, nolead2, num0+1-i, num1+i);
else
ret += dp (pos-1, limit && i == last, nolead2, 0, 0);
}
if (limit) return ret;
f[pos][num0][num1] = ret;
}
return f[pos][num0][num1];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: