UVA1640 统计问题 The Counting Problem-Solution
Link
数位dp模板
只顺顺代码吧,太板了。。
设f[i][j][k] 当前数字是i位,最高位为j时,数字p出现的次数
初始化:
void init() {
p10[0] = 1;
for(int i = 1; i <= 9; ++ i) p10[i] = p10[i - 1] * 10;
for(int i = 1; i <= 9; ++ i) {
for(int j = 0; j <= 9; ++ j) {
for(int k = 0; k <= 9; ++ k) {
for(int p = 0; p <= 9; ++ p) {
f[i][j][p] += f[i - 1][k][p];
}
}
f[i][j][j] += p10[i - 1];
}
}
}
这个转移,就是说i-1位的一个数,最前边再加上一位,变成了i位数,那f[i]...就应该继承f[i - 1]...的值,所以都加上,下边那个f[i][j][j] += p10[i - 1]是因为每次新放一位,以这一位为最高位的方案还没加上,+ p10[i-1]怎么理解呢,比如说原来的一个数是1000,再在前头加一位1,变成了11000,那新生成的数就有10000个,就加上,也就是p10[4]。