首页 > 其他 > 详细

POJ3616

时间:2020-05-10 10:27:38      阅读:38      评论:0      收藏:0      [点我收藏+]
#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;
    
}

 

POJ3616

原文:https://www.cnblogs.com/beiyueya/p/12861849.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!