标签:
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=10000):代表小明手中的项目个数。
接下来共有n行,每行有3个整数st、ed、val,分别表示项目的开始、截至时间和项目的报酬,相邻两数之间用空格隔开。
st、ed、value取值均在32位有符号整数(int)的范围内,输入数据保证所有数据的value总和也在int范围内。
对应每个测试案例,输出小明可以获得的最大报酬。
3 1 3 6 4 8 9 2 5 16 4 1 14 10 5 20 15 15 20 8 18 22 12
16 22
这个题用动态规划来做,开始采用的dp[],数组下标为时间,但这样做耗时很长,一个示例性的代码如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #define MAX 10002 6 #define inf 99999999 7 struct Project 8 { 9 int start; 10 int end; 11 int value; 12 }; 13 14 int cmp(const void *a, const void *b) { 15 Project at = *(Project *)a; 16 Project bt = *(Project *)b; 17 return at.end - bt.end; 18 } 19 20 Project act[MAX]; 21 int dp[inf]; 22 23 int main(int argc, char const *argv[]) 24 { 25 int n; 26 //freopen("input.txt","r",stdin); 27 while(scanf("%d",&n) != EOF) { 28 int endMax = 0; 29 for(int i = 0; i < n; i++) { 30 scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value); 31 if(act[i].end > endMax) { 32 endMax = act[i].end; 33 } 34 } 35 //qsort(act,n,sizeof(Project),cmp); 36 37 memset(dp, 0, sizeof(dp)); 38 for(int i = 0; i < n; i++) { 39 for(int j = endMax; j >= act[i].end; j--) { 40 int temp = dp[act[i].start] + act[i].value; 41 if(dp[j] < temp) { 42 dp[j] = temp; 43 } 44 } 45 } 46 printf("%d\n",dp[endMax]); 47 } 48 return 0; 49 }
之后下标的意义改为任务数,代码如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #define MAX 10002 7 8 using namespace std; 9 struct Project 10 { 11 int start; 12 int end; 13 int value; 14 }; 15 16 int cmp(const void *a, const void *b) { 17 Project at = *(Project *)a; 18 Project bt = *(Project *)b; 19 return at.end - bt.end; 20 } 21 22 Project act[MAX]; 23 int dp[MAX]; 24 25 int main(int argc, char const *argv[]) 26 { 27 int n; 28 //freopen("input.txt","r",stdin); 29 while(scanf("%d",&n) != EOF) { 30 int endMax = 0; 31 for(int i = 0; i < n; i++) { 32 scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value); 33 if(act[i].end > endMax) { 34 endMax = act[i].end; 35 } 36 } 37 qsort(act,n,sizeof(Project),cmp); 38 39 memset(dp, 0, sizeof(dp)); 40 dp[0] = act[0].value; 41 42 for(int i = 1; i < n; i++) { 43 dp[i] = dp[i-1]; 44 for(int j = i-1; j >= 0; j--) { 45 if(act[j].end <= act[i].start) { 46 dp[i] = max(dp[i-1], dp[j] + act[i].value); 47 break; 48 } 49 } 50 dp[i] = max(dp[i], act[i].value); 51 } 52 printf("%d\n",dp[n-1]); 53 } 54 return 0; 55 }
一开始代码提交错误,是因为没有43行这句话
标签:
原文地址:http://www.cnblogs.com/jasonJie/p/5766892.html