数的划分-递推动态规划

数的划分-递推动态规划

又一经典问题,noip2001。

用到了分类的思想。对于f[i][j]代表i分为j份。我们分为以下两类:

  1. 每份都没有1:那么我们只需要将每份都减1然后保证有j份。即加上f[i-j][j]。
  2. 至少有一份1:那么我们提出1个1,即加上f[i-1][j-1]。
  1: #include <stdio.h>
  2: #define maxn 300
  3: 
  4: int f[maxn][maxn];
  5: int n,m;
  6: 
  7: int main()
  8: {
  9:     scanf("%d%d",&n,&m);
 10:     f[0][0]=1;
 11:     for (int i=1;i<=n;++i)
 12:         for (int j=1;j<=m;++j)
 13:             if (i-j>=0)
 14:                 f[i][j]=f[i-j][j]+f[i-1][j-1];
 15:     printf("%d\n",f[n][m]);
 16:     return 0;
 17: }
 18: 

你可能感兴趣的:(数的划分-递推动态规划)