标签:limit name https tar mat its target 思考 get
考场上写了个暴力贪心(因为看到题面中的 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;
}
[USACO19DEC]Greedy Pie Eaters P
标签:limit name https tar mat its target 思考 get
原文地址:https://www.cnblogs.com/Troverld/p/14598401.html