1、将时间区间按开始时间从早到晚排序
2、定义dp[i] =以0-i的任务为任务总量, 到目前任务的截至时间前的最大效益值是多少
当一定要选择a[i]时,dpi = max(dp[i],dp[j]+a[j].eff);(a[j].end<=a[i].start)
当一定不选择a[i]时,dpi = max(dp[j])(a[j].end<a[i].end)
综上所述,dp[i] = max(dpi,dpi);
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
#include<set>
#include<math.h>
using namespace std;
#define MAX_A 10000
struct x{
int start;
int end;
int eff;
};
x tim[100000];
int cmp(x tim1,x tim2){
return tim1.start<tim2.start;
}
int dp[10000000];
int main(){
int n,m,r;
scanf("%d %d %d",&n,&m,&r);
for(int i=0;i<m;i++){
scanf("%d %d %d",&tim[i].start,&tim[i].end,&tim[i].eff);
tim[i].end+=r;
}
sort(tim,tim+m,cmp);
for(int i=0;i<m;i++){
dp[i] = tim[i].eff;
for(int j=0;j<i;j++){
if(tim[j].end<=tim[i].start){
dp[i] = max(dp[i],dp[j]+tim[i].eff);
}
}
if(i!=0){
for(int k=0;k<i;k++){
if(tim[k].end<=tim[i].end){
dp[i] = max(dp[i],dp[k]);
}
}
}
}
// for(int i=0;i<m;i++){
// printf("%d ",dp[i]);
// }
// int maxdp = 0;
// for(int i=0;i<m;i++){
// maxdp = max(maxdp,dp[i]);
// }
printf("%d\n",dp[m-1]);
return 0;
}
也可以这样定义:
dp[i] = 以0-i的所有任务为任务总量,同时选择任务i为结尾任务时的收益最大值
则dp[i] = max(dp[i],dp[j]+a[j].eff)(a[j].end<=a[i].start);
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
#include<set>
#include<math.h>
using namespace std;
#define MAX_A 10000
struct x{
int start;
int end;
int eff;
};
x tim[100000];
int cmp(x tim1,x tim2){
return tim1.start<tim2.start;
}
int dp[10000000];
int main(){
int n,m,r;
scanf("%d %d %d",&n,&m,&r);
for(int i=0;i<m;i++){
scanf("%d %d %d",&tim[i].start,&tim[i].end,&tim[i].eff);
tim[i].end+=r;
}
sort(tim,tim+m,cmp);
for(int i=0;i<m;i++){
dp[i] = tim[i].eff;
for(int j=0;j<i;j++){
if(tim[j].end<=tim[i].start){
dp[i] = max(dp[i],dp[j]+tim[i].eff);
}
}
// if(i!=0){
// for(int k=0;k<i;k++){
// if(tim[k].end<=tim[i].end){
// dp[i] = max(dp[i],dp[k]);
// }
// }
// }
}
// for(int i=0;i<m;i++){
// printf("%d ",dp[i]);
// }
int maxdp = 0;
for(int i=0;i<m;i++){
maxdp = max(maxdp,dp[i]);
}
printf("%d\n",maxdp);
return 0;
}