首先说一下题意在一长度为n的格子里放三种塔
第一种是 red 塔 在经过这个塔时有每秒 x 点的伤害
第二种是 green 塔 在这个塔之后的所有格子都会有一个每秒 y 点的伤害
第三种是 blue 塔 在这个塔之后的所有格子的时间都会增加 z 秒
经过格子有一个初始的时间。求伤害的最大值
贪心是不对的。。。应该用dp;
其中,红塔一定是放在最后的,所以可以枚举红塔的个数k;
dp【i】【j】代表有i个蓝塔,j个绿塔当前能取得的最大伤害,用dp【i】【j】来更新dp【i+1】【j】,dp【i】【j+1】;
最后的总伤害等于dp【i】【n-i-k】+k*x*(t+z*i)+(n-i-k)*k*y*(t+z*i)(i从0到n-k)的最大值。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<functional>
using namespace std;
typedef long long LL;
const int N=1505;
const int INF=0x3f3f3f3f;
LL n,x,y,z,t;
LL dp[2000][2000];
//dp[i][j] 代表 有i个冰塔j个毒塔
int main()
{
int T;
scanf("%d",&T);
for(int cases=1;cases<=T;cases++)
{
LL ans=0LL;
scanf("%lld%lld%lld%lld%lld",&n,&x,&y,&z,&t);
LL cnt=t;
LL cny=0;
LL maxx=0LL;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
dp[i+1][j]=max(dp[i+1][j],dp[i][j]+j*(t+z*i)*y);
dp[i][j+1]=max(dp[i][j+1],dp[i][j]+j*(t+z*i)*y);
}
}
for(int k=1;k<=n;k++)
{
for(int i=0;i<=n-k;i++)
{
ans=max(ans,dp[i][n-i-k]+k*x*(t+z*i)+(n-i-k)*k*y*(t+z*i));
}
}
printf("Case #%d: %I64d\n",cases,ans);
}
return 0;
}