poj2229

来源:互联网 发布:it男是接盘侠 编辑:程序博客网 时间:2024/05/19 11:48

动态规划题,比较典型的“以空间换时间”。先按照递增的顺序把1到N(题目的数据上限)的分解的数目记下,之后直接查询即可。对于i来说,

如果i是奇数,那么因为他只比他前一个偶数多一个1,所以他和前一个偶数的分解数目是一样的。如果i是偶数,我们不妨按照1,2,4,8...的

顺序来分解i。这样,如果第一个分解的元素为1,那么i就和i-1和分解数目相同。如果第一个分解的元素为2或2的m次方,则第二个

(包括2)之后的元素均为偶数,这样各个元素除以2,于是i和i/2的分解数目相同,所以如果i是偶数,那么num[i]=num[i-1]+num[i/2];

程序如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>int main(){  int n,i;  long long num[1000005]={0};  num[1]=1;num[2]=2;  for(i=3;i<=1000000;i++)  {    if(i%2==1)    {      num[i]=num[i-1];    }                     else    {      num[i]=num[i-1]+num[i/2];    }          if(num[i]>1000000000)      num[i]-=1000000000;  }  while(scanf("%d",&n)!=EOF)    printf("%ld\n",num[n]);  return 0;}

0 0