• hdu 4939


    题意:

    长度为n个单位的map,每一个单位须要时间t来走完。

    每一个单位能够放置一个塔。一共同拥有三种塔,每种塔的作用不同:

    1.仅仅能攻击当前单位。每秒x点伤害(红塔)

    2.攻击当前单位之后的全部单位,每秒y点伤害(绿塔)

    3.使目标经过本单位之后减速,之后每单位须要的时间+z(蓝塔)

    问目标受到的最多的攻击是多少

    思路:

    首先明白,1塔仅仅能放在最后才最优。

    然后就是解决前面的塔放2还是放3.。

    我刚開始是按直接贪心做的...并不正确....

    然后依照DP来考虑。但是定义的状态不太好。导致处理问题的角度并不正确...超时T_T。

    可是这道题目非常easy呀~~

    仅仅只是当时脑子就是没能想起来 这样 定义状态...


    事实上定义d[i][j] 表示前i个单位中放置了j个第三种塔。。。

    然后默认i+1~n放置的都是红塔(由于红塔一定是放置在最后的)..然后非常明显就放置了i-j个绿塔。。。

    然后d[i][j]事实上表示是在这个状态(默认i之后的都是红塔,仅仅考虑前i个)下,仅仅放置蓝塔和绿塔时~最优的情况下前i个会得到多少伤害值.....然后再加上后面的红塔伤害就好了。。

    注意那种n个单位所有放红塔的情况要考虑在内...不然wa到T_T。。


    code:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int maxn = 1505;
    
    long long n,x,y,z,t;
    long long f[maxn][maxn];
    
    void solve(){
          memset(f, 0, sizeof(f));
          long long ans = n * x * t;
          for(int i = 1; i <= n; i++){
                for(int j = 0; j <= i; j++){
                      f[i][j] = f[i-1][j] + (i-1-j)*(j*z+t)*y;
                      if(j > 0) f[i][j] = max(f[i][j], f[i-1][j-1] + (i-j)*((j-1)*z+t)*y);
                      ans = max(ans, f[i][j]+(i-j)*y*(n-i)*(j*z+t) + x * (n-i) * (j*z+t));
                }
          }
          cout << ans <<  endl;
    }
    int main(){
          int tt;
          int cas = 0;
          scanf("%d",&tt);
          while(tt--){
                cin >> n >> x >> y >> z >> t;
                printf("Case #%d: ",++cas);
                solve();
          }
          return 0;
    }
    

    sigh....这种题目也做不出来真是水成了冰渣渣orz...

  • 相关阅读:
    JS判断浏览器类型及版本
    php函数ob_start()、ob_end_clean()、ob_get_contents()
    HTML-embed标签详解
    QQ一键登录功能的实现过程
    windows 7系统搭建本地SVN服务器的过程
    php 环境工具官网地址
    yii2 auth access-token
    使用Yii2时遇到的实际问题
    PHPExcel正确读取excel表格时间单元格(转载)
    持续集成 Jenkins
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7082220.html
Copyright © 2020-2023  润新知