链接:https://vjudge.net/problem/POJ-3616#author=0
思路:dp题,首先构造一个结构保存三个时间点,然后排序。接着用状态转移,当前最大值等于之前某个休息时间外的最大值加上当前的value,所以可以构造出状态转移方程
代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct cow{
int start,end,value;
};
bool cmp(const cow &a1,const cow &a2){
return a1.start<a2.start;
}
cow a[1001];
int dp[1001];
int main(){
int n,m,r;
cin>>n>>m>>r;
for(int i=1;i<=m;i++){
cin>>a[i].start>>a[i].end>>a[i].value;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
dp[i] = a[i].value;
for(int j=1;j<i;j++){
if(a[j].end+r<=a[i].start)
dp[i] = max(dp[i],dp[j]+a[i].value);
}
}
int ans = dp[1];
for(int i=2;i<=m;i++){
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}