杀蚂蚁

啊对,你们没看错,我做了杀蚂蚁,就是辣个大模拟!

好吧,实际上只是一道同名的(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);
}
原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11798285.html