6485. 【GDOI2020模拟02.25】沙塔斯月光

题目描述


题解

镇♂男则反

如果没有操作3很好办,反着做维护操作1的次数即可

实际上一次操作3的贡献是zi*(∑i到操作1位置的距离)

维护一下即可O(n^4)

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
#define ll long long
#define file
using namespace std;

int NUM,T,n,i,j,k,l;
ll x[81],y[81],z[81],f[82][81][3161],ans;

int main()
{
	freopen("fortune.in","r",stdin);
	#ifdef file
	freopen("fortune.out","w",stdout);
	#endif
	
	scanf("%d",&NUM);
	scanf("%d",&T);
	for (;T;--T)
	{
		scanf("%d",&n);
		fo(i,1,n)
		scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
		
		memset(f,255,sizeof(f));
		ans=0;
		
		f[n+1][0][0]=0;
		fd(i,n+1,2)
		{
			fo(j,0,n-i+1)
			{
				fd(k,(n-i)*(n-i+1)/2,0)
				if (f[i][j][k]>-1)
				{
					f[i-1][j+1][k+j]=max(f[i-1][j+1][k+j+1],f[i][j][k]+x[i-1]);
					f[i-1][j][k+j]=max(f[i-1][j][k+j],f[i][j][k]+max(y[i-1]*j,z[i-1]*(k+j)));
				}
			}
		}
		
		fo(j,0,n)
		{
			fd(k,(n-1)*n/2,0)
			ans=max(ans,f[1][j][k]);
		}
		printf("%lld\n",ans);
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}
posted @ 2020-02-27 19:52  gmh77  阅读(173)  评论(0编辑  收藏  举报