http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201
又是一道不看题解我根本想不到的dp题(;´д`)ゞ
表示 这个数是由 种不同的数组成的
那么怎么转移喃?
你看:
比如
如果这 个数要是都加1,是不是就是转移到 上了
即: ,而这种最小都是 ,那就还阔以再加个
即:
所以 阔以向 两个方向转移
那么倒过来:
就会有两个方向转移而来,就是:
而 最多就
所以
所以
#include"iostream"
#include"math.h"
using namespace std;
const int MOD=1e9+7;
int dp[50005][320];
int main()
{
for(int i=1;i<=50000;i++)dp[i][1]=1;
for(int i=2;i<=50000;i++)
{
for(int j=1;j<=sqrt(i*2)&&j<i;j++)
{
dp[i][j]=(dp[i-j][j]+dp[i-j][j-1])%MOD;
}
}
int N;
while(cin>>N)
{
long long sum=0;
for(int i=1;i<=sqrt(N*2);i++)
{
sum+=dp[N][i];
sum%=MOD;
}
cout<<sum<<"\n";
}
}