zoukankan      html  css  js  c++  java
  • HDU_4939 stupid tower defense 2014多校7 多变量型DP

    意思是有个塔防游戏,有三种塔,红塔在怪物经过的时候每秒会产生攻击力大小的伤害,绿塔对怪物经过以及经过之后每秒产生攻击力大小的伤害,还有种蓝塔,对怪物进行减速,即怪物从此之后经过一个单位都会减慢c秒

    最后最最大的伤害值是多少

    又是比赛的时候没想出来,知道是个DP,但是对这种多变量型的DP就是有点不感冒。这个思想其实也是差不多的,你首先得枚举其中的一个值或者两个值

    这里有个特性,我绿塔和蓝塔放越前面越好,红塔放越后面越好(主要是腾前面的位置给另外两种),这用了点贪心技巧,但绝对是对的

    所以我们可以枚举某个点 后面全部是放红塔。。。然后我绿塔和蓝塔该怎么处理呢。这个时候我们不能猛想全局,考虑单个点的伤害,前面是绿和蓝,后面是红,这样在这个点所受的伤害,我枚举前面蓝塔有几个,则绿塔就是长度-蓝的数目,这样对该点的伤害我就可以求出来,然后通过i-1过渡出来,就可以得到整个前段受的伤害,再通过直接算出后面红塔的伤害,就可以得出这个状态下受到的总伤害,最后取最大值即可

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define LL __int64
    using namespace std;
    LL dp[1510][1510];
    int main()
    {
        int w,kase=0;
        LL n,x,y,z,t;
        scanf("%d",&w);
        while (w--)
        {
            memset(dp,0,sizeof dp);
            scanf("%I64d%I64d%I64d%I64d%I64d",&n,&x,&y,&z,&t);
            LL ans=0;
            for (int i=1;i<=n;i++){
                for (int j=0;j<=i;j++){
                    if(j<i)
                    dp[i][j]=dp[i-1][j]+((i-1-j)*z+t)*j*y;
                    if (j>0){
                       dp[i][j]=max(dp[i][j],dp[i-1][j-1]+((i-j)*z+t)*(j-1)*y);
                    }
    
                    ans=max(ans,dp[i][j]+((i-j)*z+t)*(n-i)*(x+j*y));
    
                }
            }
            ans=max(ans,n*t*x);
            printf("Case #%d: ",++kase);
            printf("%I64d
    ",ans);
        }
    }
    

      

  • 相关阅读:
    【乱侃】How do they look them ?
    【softeware】Messy code,some bug of Youdao notebook in EN win7
    【随谈】designing the login page of our project
    【web】Ad in security code, making good use of resource
    SQL数据库内存设置篇
    关系数据库的查询优化策略
    利用SQL未公开的存储过程实现分页
    sql语句总结
    sql中使用cmd命令注销登录用户
    SQLServer 分页存储过程
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3933047.html
Copyright © 2011-2022 走看看