设为首页 加入收藏

TOP

HDU 4939 Stupid Tower Defense(dp+贪心)
2015-07-20 17:55:30 】 浏览:2482
Tags:HDU 4939 Stupid Tower Defense 贪心

dp[i][j]表示到了第i步放了j个减速,造成的伤害。我们用贪心的策略把造成一段伤害的放在最后面,造成持续伤害的与减速放在前i个中这样得到的伤害是最高的。

所以前(i,j)中的伤害为dp[i][j] = max(dp[i-1][j]+(j*z+t)*(max(0LL, i-1-j))*y, dp[i-1][j-1]+((j-1)*z+t)*(i-j)*y);

每次造成的伤害就为:dp[i][j]+(n-i)*(j*z+t)*(x+(i-j)*y)。然后取一个最大值,就是伤害的最大值了。

Stupid Tower Defense

Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1194 Accepted Submission(s): 350


Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games is to try to stop enemies from crossing a map by building traps to slow them down and towers which shoot at them as they pass.

The map is a line, which has n unit length. We can build only one tower on each unit length. The enemy takes t seconds on each unit length. And there are 3 kinds of tower in this game: The red tower, the green tower and the blue tower.

The red tower damage on the enemy x points per second when he passes through the tower.

The green tower damage on the enemy y points per second after he passes through the tower.

The blue tower let the enemy go slower than before (that is, the enemy takes more z second to pass an unit length, also, after he passes through the tower.)

Of course, if you are already pass through m green towers, you should have got m*y damage per second. The same, if you are already pass through k blue towers, the enemy should have took t + k*z seconds every unit length.

FSF now wants to know the maximum damage the enemy can get.
Input There are multiply test cases.

The first line contains an integer T (T<=100), indicates the number of cases.

Each test only contain 5 integers n, x, y, z, t (2<=n<=1500,0<=x, y, z<=60000,1<=t<=3)

Output For each case, you should output "Case #C: " first, where C indicates the case number and counts from 1. Then output the answer. For each test only one line which have one integer, the answer to this question.
Sample Input
1
2 4 3 2 1

Sample Output
Case #1: 12

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
              #include 
              
                #define eps 1e-9 ///#define M 1000100 #define LL __int64 ///#define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)
               
                >T; int Case = 1; while(T--) { LL n, x, y, z, t; cin >>n>>x>>y>>z>>t; memset(dp, 0, sizeof(dp)); LL ans = n*t*x; for(LL i = 1; i <= n; i++) { for(LL j = 0; j <= i; j++) { if(j == 0) dp[i][j] = dp[i-1][j]+t*(i-1-j)*y; else dp[i][j] = max(dp[i-1][j]+(j*z+t)*(max(0LL, i-1-j))*y, dp[i-1][j-1]+((j-1)*z+t)*(i-j)*y); ans = max(ans, dp[i][j]+(n-i)*(j*z+t)*(x+(i-j)*y)); } } cout<<"Case #"<
                
                 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++学习笔记之函数指针 下一篇POJ 1856 Sea Battle(BFS).

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目