Milking Time---poj3616(简单dp)

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

题意:人从奶牛身上挤奶有m个时间段(1----n),每个时间段包含 s e f 表示从 s 到 e 的这段时间可以获得 f 单位的牛奶,每次一个时间段结束后休息 r 小时进入下一时间段

我们可以把休息的r小时加到每个时间段的结束时间上,这样就可以直接进入下一时间断了,我们按开始时间排序。。

然后就类似于最长上升子序列了

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 1100
struct node
{
    int s, e, f;
}a[N];
int cmp(node p, node q)
{
    if(p.s!=q.s)
        return p.s<q.s;
    return p.e<q.e;
}
int dp[N];
int main()
{
    int n, m, r;
    while(scanf("%d %d %d", &n, &m, &r)!=EOF)
    {
        memset(a, 0, sizeof(a));
        memset(dp, 0, sizeof(dp));
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d", &a[i].s, &a[i].e, &a[i].f);
            a[i].e+=r;
        }
        sort(a, a+m, cmp);
        int ans=0;
        for(int i=0; i<m; i++)
        {
            dp[i] = a[i].f;
            for(int j=0; j<i; j++)
            {
                if(a[j].e<=a[i].s)
                {
                    dp[i]=max(dp[i], dp[j]+a[i].f);
                }
            }
            ans=max(ans, dp[i]);
        }
        printf("%d
", ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4956447.html