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;
}

猜你喜欢

转载自www.cnblogs.com/gmh77/p/12374012.html