题目链接:http://poj.org/problem?id=2229
想通了就觉得很简单了,自己用小数据试前几项,会发现,当n为奇数时,dp[n]=dp[n-1],而当n为偶数时,dp[n]=dp[n-1]+dp[n/2]
例如: n=8时,有下列情况:
1+1+1+1+1+1+1+1
1+1+1+1+1+1+2
1+1+1+1+2+2
1+1+1+1+4
1+1+2+2+2
1+1+2+4
2+2+2+22+2+4
4+4
8
当第一个数为1时,减去这个1,刚好可以表示n=7的结果,剩下的四种情况分别除以2,会变成:
1+1+1+11+1+2
2+2
4
刚好是n=8/2=4时的结果,再结合递推方程式,很容易写出代码:
#include <iostream>
#include <cstdio>
#define MOD 1000000000
using namespace std;
int dp[1111111];
int main()
{
int N;
scanf("%d",&N);
dp[0]=1;
for(int i=1;i<N;i++)
{
if((i+1)%2==1)
dp[i]=dp[i-1];
else
dp[i]=(dp[i-1]+dp[(i-1)/2])%MOD;
}
printf("%d",dp[N-1]);
return 0;
}