Milking Time POJ - 3616(基础dp)

题目传送门

题意:

给出m个可能重叠的时间段(给出开始时间和结束时间),每个时间段都有与之对应的产奶量。现在你在这些时间段中(可以是一个或多个,时间不能重叠)给奶牛挤奶,每次挤奶后要休息r小时,求n个小时内的最大产奶量。

思路:

一读完题就知道是老经典的dp问题了。先按开始时间递增给时间段排序(其实按结束时间排序也可以,都差不多),然后按顺序遍历每个时间段now,同时遍历以往的状态tmp。如果tmp的结束时间+r <= now的开始时间(保证时间不重叠), 那么就用以往的状态加上当前的权值,去更新当前的状态,取max。
综上所述,不难推出动态转移方程:

dp[i] = max(dp[i], dp[j] + a[i].w);

Code:

int dp[1000005]; 
struct node {
    
    
	int s, e, w;
}a[1005];
int cmp(node a, node b) {
    
    
	if (a.s != b.s) return a.s<b.s;
	else return a.e<b.e;
}
int main() {
    
    
	int n, m, r;
	cin >> n >> m >> r;
	for (int i = 1; i <= m; i++)
		cin >> a[i].s >> a[i].e >> a[i].w;
	sort(a+1, a+m+1, cmp);
	int ans = -1;
	for (int i = 1; i <= m; i++) {
    
    
		dp[i] = a[i].w;
		for (int j = 1; j < i; j++) {
    
    
			if (a[j].e+r <= a[i].s)
				dp[i] = max(dp[i], dp[j] + a[i].w);
		}
		ans = max(ans, dp[i]);
	}
	cout << ans << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liudashuai666/article/details/113334615