UVA1640 统计问题 The Counting Problem-Solution

数位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]。

posted @ 2022-06-04 22:48  zcxxxxx  阅读(21)  评论(0编辑  收藏  举报