dp训练计划——poj3616LIS变形

题目链接:https://vjudge.net/problem/POJ-3616

题解:

直接把额外需要的休息时间加到结束时间上,然后按照开始时间排个序,用类似于LIS的套路求出最大牛奶量就行了。

状态:dp[i]表示从1到i的最大牛奶量

状态转移:dp[i]=dp[j]+第i个的牛奶量(1<=j<=i-1&&j的结束时间小于等于i的开始时间)

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 1e3+7;
struct node{
    int st,ed,ef;
    bool operator <(const node& a){
        return st<a.st;
    }
}p[N];
int dp[N];
int main(){
    int n=read(),m=read(),r=read();
    rp(i,1,m) p[i].st=read(),p[i].ed=read(),p[i].ef=read(),p[i].ed+=r;
    sort(p+1,p+1+m);
    rp(i,1,m){
        dp[i]=p[i].ef;
        rp(j,1,i-1)
            if(p[j].ed<=p[i].st)
                dp[i]=max(dp[i],dp[j]+p[i].ef);
    }
    printf("%d\n",*max_element(dp+1,dp+1+m));
    return 0;
}
/*
7
1 3 2 4 5 3 9
*/
发布了342 篇原创文章 · 获赞 220 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43472263/article/details/104831139