51nod 1201 整数划分
刚说完五级算法题水就被亮老师D飞
这道题其实我理解错了很多次题意。。。(一直理解成v2囧)
考虑DP,一位表示拼成什么数字跑不掉了,但是一位搞不定,考虑加一维
拼出n最大的数?好像空间不太资瓷
考虑避实就虚,开一维表示用了多少不同的数字拼出n
总的就是f[i][j]表示用i个数字拼出了j
考虑如何转移
对于这i个数字,每个都加1就可以表示出i+j啦
这样还算漏了加一个1的情况,那么对于i-1个数字,每个都加1并且在多放一个1也可以表示出i+j
所以f[i][j]=f[i][j-i]+f[i-1][j-i]
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; const int mod=1e9+7; int f[51000][330]; int main() { int n,ans=0; scanf("%d",&n); memset(f,0,sizeof(f));f[0][0]=1; for(int i=1;i<=320;i++) for(int j=i;j<=n;j++) { f[i][j]=(f[i-1][j-i]+f[i][j-i])%mod; if(j==n)ans=(ans+f[i][j])%mod; } printf("%d\n",ans); return 0; }
pain and happy in the cruel world.