HDU 3496(DP)
题目大意:
题意是 DuoDuo 想看n部电影,但是被要求最长能看的总时间数为 L ,每部电影有他的时长和DuoDuo对他的评价值 两个属性。 但是 商店有个奇怪的要求 一次只卖恰好 m 个电影碟 (m<=n) 在总时间内,为了获得最大的观赏总价值,要求得该总价值。
这个方程很好些吧。dp[i][j][k]表示前i个碟选了j个碟用了k的时间所获得的最大观赏价值
空间复杂度和时间复杂度都是N*M*L达到了10000000,空间复杂度可以用滚动数组降维,时间复杂度,10组的case如果都是极限数据可定tle
还好HDU比较仁慈,三维就可以过~
View Code
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 int n,m,l,tim[110],val[110],dp[2][110][1010],ans,tt; 7 void read() 8 { 9 scanf("%d%d%d",&n,&m,&l); 10 for(int i=1;i<=n;i++) scanf("%d%d",&tim[i],&val[i]); 11 } 12 void go() 13 { 14 memset(dp,0x8f,sizeof dp); 15 dp[0][0][0]=0; 16 for(int i=1;i<=n;i++)//前i个物品 17 for(int j=0;j<=min(i,m);j++)//选了j个 18 for(int k=0;k<=l;k++)//花费时间k 19 { 20 dp[i&1][j][k]=dp[(i-1)&1][j][k]; 21 if(j-1>=0&&k-tim[i]>=0) dp[i&1][j][k]=max(dp[i&1][j][k],dp[(i-1)&1][j-1][k-tim[i]]+val[i]); 22 } 23 ans=0; 24 for(int i=0;i<=l;i++) ans=max(ans,dp[n&1][m][i]); 25 printf("%d\n",ans); 26 } 27 int main() 28 { 29 scanf("%d",&tt); 30 while(tt--) 31 { 32 read(); 33 go(); 34 } 35 system("pause"); 36 return 0; 37 }
没有人能阻止我前进的步伐,除了我自己!