题意
传送门 POJ 3616
休息时间 R R R 可以归到工作区间。每个区间权重不同,难以使用贪心法。考虑动态规划,对区间排序,使对于每个区间,右边界小于等于其左边界的区间序号比其小。每次处理当前区间时,若区间左边界大于等于已处理好的区间的右边界,则更新答案。
d p [ i ] = m a x ( d p [ i ] , d p [ j ] + e f f i c i e n c y i ) dp[i] = max(dp[i], dp[j] + efficiency_{i}) dp[i]=max(dp[i],dp[j]+efficiencyi)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define INF 0x3f3f3f3f
#define delta 0.85
#define eps 1e-3
#define PI 3.14159265358979323846
#define MAX_M 1010
#define MAX_N 1000010
using namespace std;
struct interval{
int l, r, e;
};
int N, M, R;
interval itv[MAX_M];
int dp[MAX_M];
bool cmp(const interval& a, const interval& b){
return a.l < b.l;
}
int main(){
while(~scanf("%d%d%d", &N, &M, &R)){
memset(dp, 0, sizeof(dp));
for(int i = 0; i < M; i++){
scanf("%d%d%d", &itv[i].l, &itv[i].r, &itv[i].e);
itv[i].r += R;
}
sort(itv, itv + M, cmp);
for(int i = 0; i < M; i++) dp[i] = itv[i].e;
for(int i = 1; i < M; i++){
for(int j = 0; j < i; j++){
if(itv[i].l >= itv[j].r){
dp[i] = max(dp[i], dp[j] + itv[i].e);
}
}
}
printf("%d\n", *max_element(dp, dp + M));
}
return 0;
}

988

被折叠的 条评论
为什么被折叠?



