题目Description:

大凯有n项任务可选择去做, 分别对应有开始时间, 结束时间以及任务报酬, 同一时间内最多做一件任务, 现在大凯想知道最多能得到多少报酬, 于是把求解任务交给了你。

输入:第一行 为 n ——表示总共有n项任务 (n <= 5000)

   接下来n行, 每行有三个数, 分别对应第i个任务的开始时间si, 结束时间ei 以及任务报酬vi。(0 <= si < ei <1e5,  0 < vi <= 1e5)

输出:最多能获得的报酬。

Sample Input:

8
0 6 8
3 5 1
8 11 4
6 10 2
1 4 5
4 7 4
3 8 6
5 9 3

Sample Output

13

解题思路: dp算法

先按任务结束时间进行升序排序。

dp[i] 表示做前面 i 个 任务所能得到的最多报酬。

这里构造一个pre数组, pre[i] 表示与做第i个任务不冲突的在i之前 又与之最近的任务

dp[i]的确定:做第i个任务还是不做?  比较dp[i-1] (不做第i个)  与  dp[pre[i]] + i对应的报酬, 即: dp[i] = (dp[i-1] > dp[prev[i]] + task[i].value)? dp[i-1] : dp[prev[i]] + task[i].value;

  以下为c语言代码:

 #include <stdio.h>
#include <stdlib.h>
#define maxn 5005 struct e {
int start, end, value;
}task[maxn]; // 手写快排算法
void quick_sort(struct e * task, int left, int right) {
if (left >= right) return;
int l = left, r = right;
int base = rand() % (r - l + ) + l;
struct e temp = task[base];
task[base] = task[l];
task[l] = temp;
base = task[l].end;
while (l < r) {
while (task[r].end > base && l < r) r--;
if (l < r) {
task[l] = task[r];
l++;
}
while (task[l].end <= base && l < r) l++;
if (l < r) {
task[r] = task[l];
r--;
}
}
task[l] = temp;
quick_sort(task, left, l-);
quick_sort(task, l+, right);
} int main() {
int dp[maxn], prev[maxn], n;
scanf("%d", &n);
// 1到n记录, 空出0
for (int i = ; i <= n; i++) {
scanf("%d%d%d", &task[i].start, &task[i].end, &task[i].value);
} // 根据结束时间升序排序
quick_sort(task, , n); // 构造prev数组 pre[i] 表示与做第i个任务不冲突的在i之前 又与之最近的任务
for (int i = ; i <= n; i++) {
for (int j = i-; j >= ; j--) {
if (task[j].end <= task[i].start) {
prev[i] = j;
break;
}
}
} // 有些任务不存在pre[i], 即pre[i] = 0, 前0个任务最多价值自然为0
dp[] = ; for (int i = ; i <= n; i++) {
dp[i] = (dp[i-] > dp[prev[i]] + task[i].value)? dp[i-] : dp[prev[i]] + task[i].value;
}
printf("%d\n", dp[n]);
return ;
}

dp例题01. 任务价值最大化的更多相关文章

  1. dp(01背包问题)

    且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need( ...

  2. POJ3211 Washing Clothes[DP 分解 01背包可行性]

    Washing Clothes Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9707   Accepted: 3114 ...

  3. 树形DP(01组合背包The Ghost Blows Light HDU4276)

    题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...

  4. [HDOJ5543]Pick The Sticks(DP,01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:往长为L的线段上覆盖线段,要求:要么这些线段都在L的线段上,要么有不超过自身长度一半的部分 ...

  5. poj 2184 Cow Exhibition(dp之01背包变形)

    Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...

  6. hdu1203 I NEED A OFFER!---概率DP(01背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材 ...

  7. hdu2602 DP (01背包)

    题意:有一个容量 volume 的背包,有一个个给定体积和价值的骨头,问最多能装价值多少. 经典的 01 背包问题不谈,再不会我就要面壁了. 终于有一道题可以说水过了 ……心好累 #include&l ...

  8. hdoj2602 Bone Collector(DP,01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意 有n块骨头,每块骨头体积为volume,价值为value,还有一个容量为v的背包,现在将骨 ...

  9. poj3624 Charm Bracelet(DP,01背包)

    题目链接 http://poj.org/problem?id=3624 题意 有n个手镯,每个手镯有两个属性:重量W,需求因子D.还有一个背包,它能装下总重量不超过M的手镯.现在将一些镯子装入背包,求 ...

随机推荐

  1. [红日安全]Web安全Day9 - 文件下载漏洞实战攻防

    本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...

  2. Go coding in go way(用Go的思维去coding)

    本文是Tony Bai在2017年第三届GopherChina大会上所作,来源如下 https://tonybai.com/2017/04/20/go-coding-in-go-way/ 一.序 今天 ...

  3. php判断二个数最大公约数

    $m = isset($_GET['m']) ? $_GET['m'] : 12; $n = isset($_GET['n']) ? $_GET['n'] : 8; //判断mn的大小 if($m&g ...

  4. Redis系列二 - 数据结构

    前言 redis作为我们开发的一大神器,我们接触肯定不会少,但是很多同学也许只会存储String类型的值,这是非常不合理的.在这里,将带大家认识Redis的5中数据结构. 1.问:Redis有那些数据 ...

  5. ElasticSearch 6.2.4 实践

    参考资料 ElasticSearch 官网 ElasticSearch,Kibana,Asp.net Core with docker 示例 阮一峰 ElasticSearch 基础概念 索引(ind ...

  6. ggplot之多变量绘图

    1. 普通plot 准备数据. x<-seq(0,2*pi,0.05) y<-sin(x) z<-cos(x) data<-data.frame(x,y,z) plot: pl ...

  7. Python自定义模块

    自定义模块 自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组织结构要好,代码不冗 ...

  8. yarn报错error An unexpected error occurred:****ETIMEDOUT

    起因 在一个美好的下午,我敲击键盘输入quasar create Tangerine_Reception 我自豪的使用yarn作为包管理器,本以为万事无忧,不用担心出现npm的种种异常了...... ...

  9. 使用Filter来过滤掉需要排除的数组对象

    问题描述:有个地方需要根据判断是否是总分公司来控制转正入口的显影,list是获取到的所有入口的数组,需要判断数组里哪个对象的title为"员工转正",本来打算用for循环的,之后发 ...

  10. Spring集成axis2

    1.新建一个项目,结构如下 2.引入项目所需jar包 axis相关jar文件说明请查阅该博文 3.配置web.xml,注册axis2信息 <?xml version="1.0" ...