标签:
不错的一道dp题目,一开始想了一种N*N的dp,后面就一直想怎么优化,然后就一直都在坑中了。
这题题解还是看早了,应该再多想会的,多换种表示状态的方法再想想。
dp[i][j]=dp[i-j][j]+dp[i-j][j-1] 表示已经用了i并且最后一位为j的所有情况。
dp[0][0]=1
其中i<=50000,j<=320,算算负责度就可以了
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000000 int dp[50001][321]; int main() { int tt=1; int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=321;j++) { if(i-j>=0) { dp[i][j]=dp[i-j][j]+dp[i-j][j-1]; dp[i][j]%=m; } else break; } printf("Case #%d: ",tt++); int ans=0; for(int i=1;i<=321;i++) { ans+=dp[n][i]; ans%=m; } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenhuan001/p/4336042.html