本文已参与「新人创作礼」活动,一起开启掘金创作之路。
现在1~Q个时间段内有n(n<100)个工作,每个工作都有各自的开始时间start,结束时间end和工作所得钱p,工作时间有重叠 ,现问在这段时间内所得钱最多为多少?
输入:
8
1 4 5
3 5 1
0 6 8
4 7 4
3 8 6
5 9 3
6 10 2
8 11 4
输出:
13
#include<iostream>
using namespace std;
typedef struct{//结构体
int start;//开始时间
int end;//结束时间
int p;//该任务所得钱
}page;
int n;//任务个数
page a[100];//方案数组
int perv[100];//存放前一个选择方案
void perv_page(int n)//前面最近可以选择哪个方案
{
int t;
for(int i=1;i<=n;i++)
{
t=0;
for(int j=1;j<=n;j++)
{
if(a[j].end<=a[i].start){
t=j;continue;
}
}
perv[i]=t;
}
}
/*int f(int i){//非记忆化
if(i==0) return 0;
else
return max(f(i-1),f(perv[i])+a[i].p);
}*/
int value[100]={0};//存放每次的最佳方案
int f(int i)//记忆化
{
if(i==0) return 0;
if(value[i]!=0) return value[i];
return value[i]=max(f(i-1),f(perv[i])+a[i].p);
}
int main(){
cin>>n;//输入方案数
for(int i=1;i<=n;i++)
cin>>a[i].start >>a[i].end >>a[i].p;
a[0].p=0;
perv_page(n);
// for(int i=1;i<=n;i++) //测试存放数组 0 0 0 1 0 2 3 5
// cout<<perv[i]<<endl;
f(n);
/*for(int i=1;i<=n;i++){ //测试每次的最佳方案5 5 8 9 9 9 10 13
cout<<value[i]<<endl;
} */
cout<<value[n]<<endl;//最佳方案
return 0;
}