动态规划-有关计数问题的DP-n的m划分
•参考资料
[1]:挑战程序设计竞赛(第二版)
[2]:http://www.hankcs.com/program/m-n-recursive-division.html(注意看评论)
•自学笔记
•对参考资料[2]的理解
定义dp[ i ][ j ] : 将 j 个物品划分成 i 组的总方案数
•1.对“我们定义 n 的 m 划分具体为一个集合{ai},{ai}满足( ∑mi=1 ai ) = n” 的理解
例如 :
4的1划分的集合为{4};
4的2划分的集合为{0,4},{1,3},{2,2};
4的3划分的集合为{0,0,4},{0,1,3},{0,2,2},{1,1,2};
4的4划分的集合为{0,0,0,4},{0,0,1,3},{0,0,2,2},{0,1,1,2},{1,1,1,1};
•2.对“不存在某个ai=0”的理解
例如:
对于4的3划分有{0,0,4},{0,1,3},{0,2,2},{1,1,2};
{a1,a2,a3}分别代表4个物品划分为3组中第1组,第2组,第3组的物品个数,且a1+a2+a3=4,共4个不重复的划分方案数;
对于第一组的a1=0,a2=0表示第一组,第二组分到的物品个数为0,但总体还是划分成了三组。
那,如果“将4的3划分中的每个方案中的a1,a2,a3个数都分别 +1呢”?
即第一组的a1,a2,a3分别+1,第二组,第三组,第四组同理。
集合将变为{1,1,5},{1,2,4},{1,3,3},{2,2,3};
算一下加和a1+a2+a3=7,这就是7的3划分中不含有某个ai=0的总方案数;
因为保证了4的3划分中不重复,所以每个数都+1后,各个方案也保证不重复。
这就是参考资料[2]中当前j的i划分不存在某个ai=0的总方案数。
•3.对“存在某个ai=0”的理解
上述7的3划分中不存在ai=0的总方案数已经解决了,接下来该解决含有ai=0的总方案数了。
7的2划分方案为{0,7},{1,6},{2,5},{3,4}共4个不重复的方案数;
如果在每个方案数中都加一组0,即{0,7,0},{1,6,0},{2,5,0},{3,4,0}那不就变成了7的3划分了吗?
这不就是所要求的含有 ai=0 的7的3划分的总方案数吗?
所以,综上所述:
7的3划分的总方案数=7的3划分中不含有ai=0的总方案数+7的3划分中含有ai=0的总方案数;
也就是dp[3][7]=dp[2][7]+dp[3][4];
故状态转移方程为:dp[i][j]=dp[i-1][j]+dp[i][j-i];