zoukankan      html  css  js  c++  java
  • HDU 4939 Stupid Tower Defense (2014 Multi-University Training Contest 7)

    思路:首先红色肯定要放在最后面。前面蓝色和绿色dp求解。

    dp[i][j]  表示前面(i+j) 个 有 i 个蓝色塔  j个绿色塔 能造成最大伤害。

    //============================================================================
    // Name        : 1005.cpp
    // Author      :
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #define LL long long
    #define MAXN 1505
    using namespace std;
    LL dp[MAXN][MAXN];
    LL max(LL x,LL y)
    {
        return x>y?x:y;
    }
    int main() {
        int tt,ri=0;
        LL n,x,y,z,t;
        scanf("%d",&tt);
        while(tt--)
        {
            LL ans=0;
            scanf("%I64d%I64d%I64d%I64d%I64d",&n,&x,&y,&z,&t);
            memset(dp,0,sizeof(dp));
            for(int i=0;i<=n;++i)//blue
            {
                for(int j=0;j+i<=n;++j)//green
                {
                    LL k=n-i-j;
                    LL v=z*i+t;
                    LL tmp=dp[i][j]+k*v*x+k*v*y*j;//剩下后面补上红色
                    ans=max(tmp,ans);
                    LL add=v*y*j;// 加一个 蓝色绿色对于当前格子都没影响,影响只来源于前面的。
                    dp[i+1][j]=max(dp[i+1][j],dp[i][j]+add);
                    dp[i][j+1]=max(dp[i][j+1],dp[i][j]+add);
                }
            }
            printf("Case #%d: %I64d
    ",++ri,ans);
        }
        return 0;
    }
  • 相关阅读:
    临时表的问题
    List集合和Set集合互转
    mysql数据库事件
    mysql存储过程事务
    N皇后问题
    递归实现字符数组的全排列及组合
    判断一个序列是否为某二叉搜索树的后续遍历结果
    递归实现两个有序链表的合并
    递归实现字符串反转
    根据字节数截取字符串
  • 原文地址:https://www.cnblogs.com/L-Ecry/p/3908070.html
Copyright © 2011-2022 走看看