zoukankan      html  css  js  c++  java
  • [USACO19DEC]Greedy Pie Eaters P

    LXXIII.[USACO19DEC]Greedy Pie Eaters P

    考场上写了个暴力贪心(因为看到题面中的 greedy ……)然后光荣爆炸……

    因为\(n\leq 300\),考虑区间DP。

    \(f[i][j]\)表示有且只有区间\([i,j]\)里的\(\pi\)被吃完后的最大收益。

    则我们可以得到如下转移:

    \(f[i][j]=\max\limits_{k=i}^{j}f[i][k-1]+???+f[k+1][j]\)

    含义为:我们特地留下第\(k\)\(\pi\)不吃,剩下全吃掉,然后选择能吃到第\(k\)\(\pi\)的最大的那头牛。

    而这个\(???\),就是那头牛的体重。

    我们思考这头牛必须具有什么特征:

    首先,它所吃掉的\(\pi\),必定是\([i,j]\)的子区间;

    其次,这个区间里必须包含第\(k\)\(\pi\)

    因此,我们设\(g[i][j][k]\)表示这样的牛的最大体重。

    然后\(g\)也可以通过区间DP算出。

    复杂度\(O(n^3)\)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,f[510][510],g[510][510][510];
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1,x,y,z;i<=m;i++){
    		scanf("%d%d%d",&z,&x,&y);
    		for(int j=x;j<=y;j++)g[x][y][j]=max(g[x][y][j],z);
    	}
    	for(int k=1;k<=n;k++)for(int i=k;i>=1;i--)for(int j=k;j<=n;j++)g[i][j][k]=max(g[i][j][k],max(g[i+1][j][k],g[i][j-1][k]));
    	for(int l=1;l<=n;l++)for(int i=1,j=i+l-1;j<=n;i++,j++)for(int k=i;k<=j;k++)f[i][j]=max(f[i][j],f[i][k-1]+g[i][j][k]+f[k+1][j]);
    	printf("%d\n",f[1][n]);
    	return 0;
    }
    

  • 相关阅读:
    【Rust】变量绑定
    【Rust】枚举的使用
    1月25日 学习记录
    1月19日 学习记录
    1月22日 学习记录
    1月21日 学习记录
    1月29日 体温APP开发记录
    今日进度
    今日进度
    今日进度
  • 原文地址:https://www.cnblogs.com/Troverld/p/14598401.html
Copyright © 2011-2022 走看看