Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 125 Accepted Submission(s): 34
php
题意:ios
有n种卡片1~n,m个卡包,每一个卡包中包含一段连续的不重复的卡片,wen最多买k个卡包可以获得的最多的种类的卡片。app
代码:post
//n和k只有2000,能够用nk的方法,f[i][j]表示到达i位置使用了j个卡包的最大卡片种类数,先处理出来若是买了i卡片可以买到的左边的最远的那 //个卡片lef[i],这样就能够转移了,到达i位置考虑买仍是不买,不买就由前一个转移,买就由lef[i]-1转移来。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int INF=0x3f3f3f3f; int t,n,m,k,f[2009][2009],lef[2009]; int main() { scanf("%d",&t); for(int cas=1;cas<=t;cas++){ memset(f,0,sizeof(f)); memset(lef,INF,sizeof(lef)); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); for(int j=x;j<=y;j++) lef[j]=min(lef[j],x); } int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ if(lef[i]==INF){ f[i][j]=f[i-1][j]; continue; } int tmp=lef[i]-1; f[i][j]=max(f[i-1][j],f[tmp][j-1]+(i-tmp)); ans=max(ans,f[i][j]); } } printf("Case #%d: %d\n",cas,ans); } return 0; }