动态规划-有关计数问题的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];

posted @ 2018-11-07 20:10  HHHyacinth  阅读(765)  评论(0编辑  收藏  举报