*POJ3616.Milking Time(dp)

题目链接:http://poj.org/problem?id=3616
题意:给出n m r,m个挤奶时间段,每挤一次奶要休息r个时间点,两次挤奶的时间不可以有重叠,问n个时间点最多可以获得多少奶
解题思路:预处理m个时间段,将其按照起始时间由小到大进行排序,dp[i]表示到第i个时间段(使用时间点无法进行)可以获得的最大奶量。
转移方程
dp[i]=max(dp[i],dp[j]+milk[i].v)
转移条件:
milk[j].e<=milk[i].s

for(int i=1;i<=m;i++){
		dp[i]=milk[i].v;   //初始化第i个时间段dp[i]
		                   //它一定可以完成自身
		for(int j=1;j<i;j++){
			if(milk[j].e<=milk[i].s){
				dp[i]=max(dp[i],dp[j]+milk[i].v);
			}
		}
	}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,r;
struct node{
	int s,e,v;
	bool operator <(node a){
		return s<a.s;
	}
}milk[1100];
int num[1100];
int dp[1100];
int ans;
int main(){
	cin>>n>>m>>r;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&milk[i].s,&milk[i].e,&milk[i].v);
		milk[i].e+=r;
	}
	sort(milk+1,milk+1+m);
	for(int i=1;i<=m;i++){
		dp[i]=milk[i].v;
		for(int j=1;j<i;j++){
			if(milk[j].e<=milk[i].s){
				dp[i]=max(dp[i],dp[j]+milk[i].v);
			}
		}
	}
	for(int i=1;i<=m;i++)
		ans=max(ans,dp[i]);
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/107239768