51nod 1201 整数划分

来源:互联网 发布:linux网卡怎么激活 编辑:程序博客网 时间:2024/05/24 03:21

偷懒写了记忆化,没爆栈真的好神奇。。。

因为每次操作最大为2*mod,所以数组开int就够了

dp[x][y]=(dfs(x-y,y-1)+dfs(x-y,y))%mod;

dp[x][y]表示y个不同的数字之和x的种数。

#include<bits/stdc++.h>using namespace std;const int mod=1e9+7;int dp[50050][350];int dfs(int x,int y){if(y<=0||x<=0)return 0;if(dp[x][y]!=-1)return dp[x][y];return dp[x][y]=(dfs(x-y,y-1)+dfs(x-y,y))%mod;}int main(){int x,mxnum,ans,i;memset(dp,-1,sizeof(dp));dp[1][1]=1;while(~scanf("%d",&x)){mxnum=sqrt(2*x);if((mxnum+1)*mxnum/2>x)mxnum--;ans=0;for(i=1;i<=mxnum;i++)ans=(ans+dfs(x,i))%mod;printf("%d\n",ans);}}


0 0
原创粉丝点击