题目描述
题解
镇♂男则反
如果没有操作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
",ans);
}
fclose(stdin);
fclose(stdout);
return 0;
}