Question link: http://acm.hdu.edu.cn/showproblem.php? PID = 1, 4939
Stupid tower defense
Time Limit: 12000/6000 MS (Java/others) memory limit: 131072/131072 K (Java/Others)
Total submission (s): 493 accepted submission (s): 129
Problem descriptionfsf 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 shoshould have got M * y damage per second. the same, if you are already pass through K blue towers, the enemy shoshould have took T + K * z seconds every unit length.
FSF now wants to know the maximum damage the enemy can get. inputthere 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)
Outputfor each case, You shoshould 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
12 4 3 2 1
Sample output
Case #1: 12HintFor the first sample, the first tower is blue tower, and the second is Red Tower. So, the total damage is 4*(1 + 2) = 12 damage points.
Authoruestc source2014 multi-university training contest 7
Question:
We can provide you with a length of N. Each unit can contain one tower. There are three types of towers.
1) x-second damage attacks against enemies passing through the tower
2) Attacks against enemies that have already passed through the tower by Y per second
3) Slow down to the enemy who has already passed through the tower, and change the speed that originally passes through a unit time of t to t + K.
Official question: http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html
The Code is as follows: (according to the official question)
# Include <cstdio> # include <cstring> # include <iostream> using namespace STD; const int maxn = 1617; typedef _ int64 ll; ll DP [maxn] [maxn]; ll n, x, y, z, T; int main () {int t; int CAS = 0; scanf ("% d", & T); While (t --) {scanf ("% i64d % i64d % i64d % i64d % i64d", & N, & X, & Y, & Z, & T); memset (DP, 0, sizeof (DP); LL ans = N * T * X; // put all in the Red Tower for (ll I = 1; I <= N; I ++) for (ll j = 0; j <= I; j ++) {If (j = 0) // no slowdown tower (blue Tower) DP [I] [J] = DP [I-1] [J] + T * (i-j-1) * Y; else DP [I] [J] = max (DP [I-1] [J-1] + (I-j) * y * (t + (J-1) * z ), DP [I-1] [J] + (i-j-1) * y * (t + J * z); ans = max (ANS, DP [I] [J] + (n-I) * (J * z + T) * (x + (I-j) * Y ));} printf ("case # % d: % i64d \ n", ++ cas, ANS);} return 0 ;}