POJ3616

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[10050];
struct sa{
    int x,y,sum;
}p[10050];
//我觉得结构体的基础知识你得复习下 
int cmp(const sa a,const sa b){
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
} 
//比较函数 
int main(){
    int n,m,t;
    scanf("%d%d%d",&n,&m,&t);
    //一个整个时间段,一个是 能挤几次,最后一个是要恢复的时间
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].sum);
        //每次挤的时间区间和能挤出的量 
        p[i].y+=t;
        //把延续的时间一加,就当这个时间段都只能做一个了 
    } 
    sort(p,p+m,cmp);
    //这个排序要看上面的cmp,挺值得学习的
    //另外这个排序对于这个题也挺关键的
    for(int i=m-1;i>=0;i--){
        dp[i]=p[i].sum;
        //嗯因为是在外面定义的所以全是零喽
        //至于i的开始我觉得你得去问问你的排序怎么排的 
        for(int j=i+1;j<m;j++)
            if(p[j].x>=p[i].y){
                dp[i]=max(dp[i],dp[j]+p[i].sum);
            }
        //转印方程还得思考思考
        //类比才是王道,直接类比个地下城的刷图,固定下时间就ok
        //我觉得这转移方程也不好想吖 
    } 
    int maxx=0;
    for(int i=0;i<m;i++)
    maxx=max(maxx,dp[i]);
    cout<<maxx<<endl;
    return 0;
    
}

 

posted @ 2020-05-10 07:53  北月真好  阅读(143)  评论(0编辑  收藏  举报