POJ 3616 Milking Time(最大递增子序列变形)

题目链接:http://poj.org/problem?id=3616

题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间、结束时间、生产效率(时间都不超过N),只能在给出的时间段内生产,要求合理安排时间求出最大生产价值。

解题思路:把区间按开始时间排序,于是有状态转移方程:dp[i]=max(dp[i],dp[j]+a[i].val)(前提是a[j].end+r<=a[i].start,i是区间的序号,j是i前面的区间)

     相当于最大递增子序列的变形,写法差不多。

代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring> 
 4 using namespace std;
 5 const int N=1e3+5;
 6 
 7 struct node{
 8     int start,end,val;
 9 }a[N];
10 
11 bool cmp(node a,node b){
12     return a.start<b.start;
13 }
14 
15 int dp[N];
16 
17 int main(){
18     int n,m,r;
19     while(~scanf("%d%d%d",&n,&m,&r)){
20         for(int i=1;i<=m;i++)
21             scanf("%d%d%d",&a[i].start,&a[i].end,&a[i].val);
22         sort(a+1,a+1+m,cmp);
23         
24         int ans=0;
25         //不重合的最大递增区间,类似最大递增子序列 
26         for(int i=1;i<=m;i++){
27             dp[i]=a[i].val;
28             for(int j=1;j<i;j++){
29                 if(a[j].end+r<=a[i].start){
30                     dp[i]=max(dp[i],dp[j]+a[i].val);
31                 }                
32             }
33             ans=max(ans,dp[i]);
34         }
35         printf("%d
",ans);
36     }
37     return 0;
38 }

 

原文地址:https://www.cnblogs.com/fu3638/p/7506551.html