
链接:https://vjudge.net/problem/POJ-3616#author=0
思路:dp题,首先构造一个结构保存三个时间点,然后排序。接着用状态转移,当前最大值等于之前某个休息时间外的最大值加上当前的value,所以可以构造出状态转移方程
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#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; }
|
近期评论