zoukankan      html  css  js  c++  java
  • 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 } 
    没有人能阻止我前进的步伐,除了我自己!
  • 相关阅读:
    SQLServer和Access数据传输简单总结
    Session 详解
    SQL日志文件过大问题的解决方法
    如何删除表中的重复记录?
    HDOJ 3711 Binary Number
    HDOJ 2022
    活动选择问题
    浮点数的比较
    HDOJ 2037
    找最长递增子数列
  • 原文地址:https://www.cnblogs.com/proverbs/p/2662847.html
Copyright © 2011-2022 走看看