看了挑战程序设计竞赛的DP部分中的划分数问题,刚开始真是云里雾里,有些字母的写法太过于高端,以至于不能理解,经过了半小时之多的认真思考与研究,终于给搞明白了。
原题大概是这样的:
有N个无区别的物品,将他们划分成不超过M组,求出划分方法数模Mod的余数
- 1≤M≤N≤1000
- 2≤Mod≤10000
sample input:
N = 4,M=3, Mod = 10000;
sample output:
4 (1+1+2 = 1+ 3 = 2+2 =4);
dp[i][j]:= j的i划分的总数。
然后书中给出动态规划方程:
dp[i][j] = dp[i][j-i] + dp[i-1][j]
这里直接借助上边这个题目给出思路:
首先对于j的i划分总数,比如 4 (1+1+2 = 1+ 3 = 2+2 =4),即为4的3划分总数,
可以看作是 4(1+1+2 = 0+1+3=0+2+2=0+0+4),那么对于i的j划分,这其中的划分方式,可以分为,不包括数字0的和包括数字0的,那么对于不包括数字0的,该划分方式中一定有j个数,如该题,不包括数字0的即为1+1+2,数字的个数即为3,那么将该方式中的每个数字减去1,就得到了,i-j的j划分,如该题,4-3的3划分即为(1-1)+(1-1)+(2-1) => 0+0+1 ,对于其他数字较大的,该方式同样适用,可以举例子证明下。而对于包括数字0的,每一种划分去掉一个0,就变成了i的j-1划分,即为 4的2划分 => (1+3 = 2+2=0+4)那么4的3划分,即为4-3 的3划分加上4的2划分。
所以得到dp公式:
dp[i][j] = dp[i][j-i] + dp[i-1][j]
(dp[i][j] = dp[i-1][j] =...=dp[j][j] j<i)
写的比较混乱,希望日后再看的时候能够看懂 - -;