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 input12 4 3 2 1
Sample outputcase #1: 12
# Include "iostream" # include "cstdio" # include "cstring" using namespace STD; typedef _ int64 ll; const int MS = 1600; ll DP [MS] [MS]; ll max (ll a, LL B) {return A> B? A: B;} int main () {ll ans, B, c; // note that B and C must be defined as LL, because the subsequent calculation contains the ll number. Int T, P = 1; int n, x, y, z, T; scanf ("% d", & T); // CIN> T; while (t --) {printf ("case # % d:", P ++); // cout <"case #" <p ++ <": "; scanf (" % d ", & N, & X, & Y, & Z, & T ); // CIN> N> x> Y> Z> T; memset (DP, 0, sizeof (DP); ans = x * n * t; for (B = 0; B <= N; B ++) for (C = 0; C + B <= N; C ++) {DP [B + 1] [c] = max (DP [B + 1] [c], DP [B] [C] + C * y * (t + B * z )); DP [B] [C + 1] = max (DP [B] [C + 1], DP [B] [C] + C * y * (t + B * z); ans = max (ANS, DP [B] [C] + (n-B-c) * x * (t + B * z) + (n-B-c) * y * C * (t + B * z);} printf ("% i64d \ n", ANS); // cout <ans <Endl ;} return 0 ;}