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 shoshould have got mY damage per second. The same, if you are already pass through K blue towers, the enemy shoshould have took T + kZ 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 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
1 2 4 3 2 1
Sample output
Case #1: 12
Hint
For 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.
Code:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>typedef __int64 ll;using namespace std;const int maxn = 1510;ll dp[maxn][maxn];ll n, x, y, z, t;int main() {int Cas;scanf("%d", &Cas);for (int cas = 1; cas <= Cas; cas++) {scanf("%I64d%I64d%I64d%I64d%I64d", &n, &x, &y, &z, &t);memset(dp, 0, sizeof(dp));ll ans = n * x * t;for (ll i = 1; i <= n; i++) {for (ll j = 0; j <= i; j++) {if (j == 0)dp[i][j] = dp[i-1][j] + (i-1-j) * t * y;else dp[i][j] = max(dp[i-1][j-1]+(i-j)*y*(t+(j-1)*z), dp[i-1][j]+(i-1-j)*y*(t+j*z));ans = max(ans, dp[i][j] + (n-i)*(j*z+t)*(x+(i-j)*y));}}printf("Case #%d: ", cas);printf("%I64d\n", ans);}return 0;}