码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO19DEC]Greedy Pie Eaters P

时间:2021-03-31 12:19:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:limit   name   https   tar   mat   its   target   思考   get   

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

[USACO19DEC]Greedy Pie Eaters P

标签:limit   name   https   tar   mat   its   target   思考   get   

原文地址:https://www.cnblogs.com/Troverld/p/14598401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!