题目链接: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 }