动态规划 -----入门练习1

79 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 

现在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;
}