POJ3616 Milking Time(DP:最大子段和)
题意:
奶牛产奶,一共n长的时间,可以有m个时间段,每个时间段对应一个产奶量,一个时间段后要休息r时间,求最大产奶量。
要点:
就是一个最大子段和的变形,先将时间段从开始排序,可以写出状态转移方程为:
if (time[i].x >= time[j].y + r)
dp[i] = max(dp[j] + time[i].w, dp[i]);
边界条件就是dp[i]=time[i].w。
15661321 | Seasonal | 3616 | Accepted | 192K | 63MS | C++ | 657B | 2016-07-04 17:09:39 |
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct node
{
int x, y, w;
}time[1005];
int dp[1005];
int n, m, r;
int cmp(node a, node b)
{
return a.x < b.x;
}
int main()
{
int i, j;
while (scanf("%d%d%d", &n, &m, &r) != EOF)
{
for (i = 1; i <= m; i++)
scanf("%d%d%d", &time[i].x, &time[i].y, &time[i].w);
sort(time + 1, time + m + 1, cmp);
for (i = 1; i <= m; i++)
dp[i] = time[i].w;
int ans = -1;
for (i = 1; i <= m; i++)
{
for (j = 1; j < i; j++)
if (time[i].x >= time[j].y + r)
dp[i] = max(dp[j] + time[i].w, dp[i]);
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
}
return 0;
}