题目链接点击打开链接:poj3616
题目大意:
在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟;
接下来给m组数据表示挤奶的时间与奶量求最大挤奶量
本题其实很简单的,一个简单的动态规划,用一个dp表示在第i个时间段挤奶量的最大值,从i+1更新到M
不要忘记排序
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <limits.h>
#include <cmath>
#include <queue>
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);//这一步很关键,时间是有顺序的
// for(int i=0;i<m;i++)
// cout<<p[i].x<<" "<<p[i].y<<endl;
for(int i=m-1;i>=0;i--){
dp[i]=p[i].sum;
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);//这里就是转移方程
// cout<<j<<" "<<dp[j]<<endl;
}
}
int maxx=0;
for(int i=0;i<m;i++)
maxx=max(maxx,dp[i]);
cout<<maxx<<endl;
return 0;
}