啊对,你们没看错,我做了杀蚂蚁,就是辣个大模拟!
好吧,实际上只是一道同名的(DP)而已。。。
稍微有一些分析。
通过观察题面,我们显然得知,先放放射塔和干扰塔是更优的,因此我们将问题转化为了如何在前面放置放射与干扰,在最后放激光使得伤害最高。
我们设(f[i][j])表示前(i)个塔只放放射与干扰,后(n-i)个塔放激光时,前(i)个塔中有(j)个干扰的答案。
因为这里是一只鸽子在写文章,所以就不放方程了。
显然这个方程很好推不是吗?
然而这一题要开会爆(long) (long),然后我们就。。。开(int128)跑路。
#include<bits/stdc++.h>
using namespace std;
#define int __int128
inline int read()
{
int f=1,w=0;char x=0;
while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
return w*f;
}
const int N=5200;
int n,T,r,b,g,ans,f[N][N];
inline void print(int x)
{
if(!x) {puts("0");return;}
string S="";while(x) S+=x%10+'0',x/=10;
reverse(S.begin(),S.end());cout<<S;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
#endif
n=read(),r=read(),g=read(),b=read(),T=read();
for(int i=1;i<=n;i++) f[i][0]=f[i-1][0]+T*g*(i-1);
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
f[i][j]=max(f[i-1][j]+(T+j*b)*g*(i-1-j),f[i-1][j-1]+(T+(j-1)*b)*g*(i-j));
for(int i=0;i<=n;i++)
for(int j=0;j<=i;j++)
ans=max(ans,f[i][j]+(n-i)*r*(T+j*b)+(i-j)*g*(T+j*b)*(n-i));
print(ans);
}