一条长度为n的直线上有n个塔,每个格一个。塔分为3种,一种会让怪在过了当前格之后每个格多停留一段时间,一种会在怪物在当前格时每秒造成伤害,一种会在怪物过了当前格之后每秒造成伤害。
首先我们可以知道,所有的在当前格造成伤害的塔都会放在最后。
然后对于另外两种塔,定义状态dp[i][j]为i个减速塔和j个攻击塔所能造成的最大伤害,则dp[i][j]可以由dp[i-1][j]和dp[i][j-1]转移过来。
#include <cstdio>
long long dp[1501][1501];
int n,x,y,z,t;
inline long long max(const long long &x,const long long &y) {
return x>y?x:y;
}
inline long long damage(int j) {
return j*y;
}
inline long long time(int i) {
return i*z+t;
}
int main() {
int tt,cas,i,j;
scanf("%d",&tt);
for (cas=1;cas<=tt;cas++) {
long long ans=0;
scanf("%d%d%d%d%d",&n,&x,&y,&z,&t);
for (i=0;i<=n;i++)
for (j=0;i+j<=n;j++)
dp[i][j]=0;
for (i=0;i<n;i++) {
for (j=0;i+j<n;j++) {
long long tmp=dp[i][j]+damage(j)*time(i);
dp[i+1][j]=max(dp[i+1][j],tmp);
dp[i][j+1]=max(dp[i][j+1],tmp);
}
}
for (i=0;i<=n;i++)
for (j=0;i+j<=n;j++)
ans=max(ans,dp[i][j]+(damage(j)+x)*time(i)*(n-i-j));
printf("Case #%d: %lld\n",cas,ans);
}
return 0;
}