hdu,1028,整数拆分的理解

#include"iostream"
using namespace std;
int main()
{
  int n,i,j,k;
  int c[122],temp[122];
  //c[] 数组用于储存当前多项式各项系数
  //temp[]数组用于暂时储存在运算时的两多项式相加的系数和
  while(cin>>n&&n!=0)
  {
    for(i=0;i<122;i++)       //系数初始化,当前c[]所指的多项式是第一个多项式
    {c[i]=1; temp[i]=0;}

    for(i=2;i<=n;i++)       //运算次数的控制
    {
      for(j=0;j<=n;j++)
      for(k=0;k+j<=n;k+=i)
        temp[k+j]+=c[j];   //系数相加
      for(j=0;j<=n;j++)     //新的多项式系数和temp[]初始化
      {
        c[j]=temp[j];
        temp[j]=0;
      }
    }
  cout<<c[n]<<endl;
  }
  return 0;
}

 

看了一下午加一晚上的母函数还有代码,原谅我笨,总于明白了一点,所以就和大家分享一下。

源问题是杭电ACM的1028题,大概意思是求 整数 n 的拆分数,大概算法思路有两种,一种是多项式乘法,一种是递推,我起先也是从递推考虑,后来才发现我找不到递推规律,因为它是一个二维数组递推,record[n-m][m]+record[n][m-1] (N>m)(原谅我找不到他的规律)所以就在多项式上着手

先给出公式(这是有好处的):G(n)=(1+x+x^2+....x^i)*(1+x^2+x^4+....x^i)(1+x^3...+x^i).....(1+x^i)( i 是指最接近 n且满足规律且小于等于n )

至于式子,自己理解,大概就是排列组合,这个还是百度一下 母函数 的基础概念比较好(宝宝是数学渣渣)

对于算法的实现:我们可以这样想G1*G2*G3*G4...Gi,可以先算出G1*G2,得到Gh,再让Gh*G3,所以要有一个大的循环控制运算次数

对于多项式的次数可以用数组下标表示,而系数用数组值表示,储存在c[]数组中,而与c[]相乘的多项式可以用第三次循环表示for(k=0;k+j<=n;k+=i){},temp[i]用于暂时存储相乘后次数为 i 的项的系数,k+j 就是表示两个多项式其中的各自的某一项相乘的次数。每次计算完成后可以由temp[]转给c[],temp[]清零后接着与下一个多项项相乘

对于多项式建议大家好好研究研究在排列组合和一些比较麻烦的问题上相当的重要,泰勒公式没学好,宝宝心里苦呀!数学很重要,真的!对于多项式和母函数之类的数学问题等我补好了缺口再与大家分享。

posted @ 2016-05-17 01:17  DoubleLeft  阅读(1061)  评论(0编辑  收藏  举报