您的位置:首页 > 其它

[POJ 3616]Milking Time[DP]

2016-01-14 11:27 387 查看
题目链接:[POJ 3616]Milking Time[DP]
题意分析:

给出M个区间,每个区间有对应的产奶量efficiency[i],奶牛每次挤完奶要休息R分钟,问:最大的挤奶量是多少?(农夫在起始分钟的开始处开始挤奶,在结束分钟的开始处结束挤奶)

解题思路:

设dp[i]为选择第i个区间可以得到的最大产奶量。dp[i] = max(dp[0 ~ i]) + efficiency[i]。由于选择的区间只对上面选择的区间影响,所以整个区间选择是个重复的子问题,而一旦选择了前面的区间,这后面的区间就与其没关系了,没有后效性。

个人感受:

一看题目我觉得很像01背包,然后想怎么表示状态,发现还得记录区间上限,复杂度感人。然后就GG了 = =。

具体代码如下:

#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

struct Interval {
int ans, up, down;
bool operator < (const Interval &t)const {
if (down == t.down) return up < t.up;
return down < t.down;
}
}inter[1011];

int main()
{
int n, m, r; scanf("%d%d%d", &n, &m, &r);
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &inter[i].down, &inter[i].up, &inter[i].ans);
inter[i].up += r;
}
sort(inter, inter + m);

int ans = 0;
for (int i = 0; i < m; ++i) {
int mx = 0;
for (int j = 0; j < i; ++j) {
if (inter[j].up <= inter[i].down && inter[j].ans > mx)
mx = inter[j].ans;
}
inter[i].ans += mx;
ans = max(ans, inter[i].ans);
}
printf("%d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: