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; }