Greedy Pie Eaters —— 区间DP,有丶东西

这个没有链接

题意:

现在有一张长为n的饼(n<=300),现在有m头牛,每头牛都喜欢吃这个饼的一个区间,并且每头牛的区间都不相同。每头牛都有一个重量wi。现在你要选出一些牛,按照一个次序让他们去吃这个饼,到第i头牛的时候,他会把这个饼的li~ri部分全部吃光,如果到一头牛的时候,已经没有它喜欢吃的区间的饼了,他就会不开心,你需要避免这种请款选出一个序列,并且使得选出的牛的体重之和最大。

题解:

可以的,要检讨一下,300的数据范围为什么想不到区间dp,不过这道题就算我想到区间dp也不一定能够做出来。
我们在枚举区间断点的时候,需要同时维护断点在区间内的牛的最大重量,然后更新。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5,M=305;
ll dp[M][M],v[M][M],mx[M][M];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int x,y;
    ll w;
    for(int i=1;i<=m;i++)
        scanf("%lld%d%d",&w,&x,&y),dp[x][y]=v[x][y]=mx[x][y]=w;
    for(int len=2;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            for(int k=l;k<=r;k++){
                mx[l][k]=max(mx[l][k],max(mx[l+1][k],v[l][r]));
                dp[l][r]=max(dp[l][r],dp[l][k-1]+dp[k+1][r]+mx[l][k]);
            }
        }
    }
    printf("%lld\n",dp[1][n]);
    return 0;
}
/*
5 3
100 1 2
100 2 4
100 3 5
*/

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/107165931
pie