POJ3616---Milking Time

题目大意:Bessie在N个小时内可以给M头奶牛挤奶,挤完一头牛需休息R小时,求怎样挤才能使产量最多
分析:权重的DP,先进行排序,再转移
状态:d[i]表示在从开始到第i段的最优解。
状态转移:if(a[i].x >= a[j].y+r) d[i] = max(d[i], d[j]+a[i].w);
代码:

#include <cstdio>
#include <algorithm>
using namespace std;

struct interval{
    int x, y, w;
};
interval a[1010];

bool cmp(interval i, interval j) {
    if(i.x != j.x) return i.x < j.x;
    else return i.y < j.y;
}

int main() {
    int n, m, r, ans = 0;
    int d[1010];
    scanf("%d%d%d", &n, &m, &r);
    for(int i = 0; i < m; i++)
        scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].w);
    sort(a, a+m, cmp);
    for(int i = 0; i < m; i++)
        d[i] = a[i].w;
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < i; j++) {
            if(a[i].x >= a[j].y+r)
                d[i] = max(d[i], d[j]+a[i].w);
        }
        ans = max(ans, d[i]);
    }
    printf("%d\n", ans);
    return 0;
}

你可能感兴趣的:(poj)