dp例题01. 任务价值最大化
题目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. 任务价值最大化的更多相关文章
- dp(01背包问题)
且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need( ...
- POJ3211 Washing Clothes[DP 分解 01背包可行性]
Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9707 Accepted: 3114 ...
- 树形DP(01组合背包The Ghost Blows Light HDU4276)
题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...
- [HDOJ5543]Pick The Sticks(DP,01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:往长为L的线段上覆盖线段,要求:要么这些线段都在L的线段上,要么有不超过自身长度一半的部分 ...
- poj 2184 Cow Exhibition(dp之01背包变形)
Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...
- hdu1203 I NEED A OFFER!---概率DP(01背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材 ...
- hdu2602 DP (01背包)
题意:有一个容量 volume 的背包,有一个个给定体积和价值的骨头,问最多能装价值多少. 经典的 01 背包问题不谈,再不会我就要面壁了. 终于有一道题可以说水过了 ……心好累 #include&l ...
- hdoj2602 Bone Collector(DP,01背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意 有n块骨头,每块骨头体积为volume,价值为value,还有一个容量为v的背包,现在将骨 ...
- poj3624 Charm Bracelet(DP,01背包)
题目链接 http://poj.org/problem?id=3624 题意 有n个手镯,每个手镯有两个属性:重量W,需求因子D.还有一个背包,它能装下总重量不超过M的手镯.现在将一些镯子装入背包,求 ...
随机推荐
- 大厂常问iOS面试题--性能优化篇
1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候 ...
- Linux学习4-部署LAMP项目
前言 LAMP——linux Apache Mysql PHP 今天我们来学习如何在Linux部署Discuz论坛 准备工作 1.一台linux服务器,没有购买服务器的小伙伴也可以使用虚拟机,操 ...
- cmd 输入输出
cmd 输入输出 首先在编写如: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> vo ...
- PHP mysql事务问题实例分析
本文实例分析了PHP的mysql事务问题.分享给大家供大家参考,具体如下: 对于myisam数据库,可以控制事务的进行: $mysqlrl = mysql_connect ( $db_config [ ...
- h5样式
禁止长按默认事件 安卓(android): window.ontouchstart = function(e) { e.preventDefault(); }; 苹果(ios): -webkit-to ...
- [转载]Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 转载至:https://www.sdnlab.com/17530.html 我们使用Linux作为服务器操作系统时,为了达到高并发处理 ...
- Vue2.0 【第二季】第4节 Vue的生命周期(钩子函数)
目录 Vue2.0 [第二季]第4节 Vue的生命周期(钩子函数) 第4节 Vue的生命周期(钩子函数) Vue2.0 [第二季]第4节 Vue的生命周期(钩子函数) 第4节 Vue的生命周期(钩子函 ...
- 超强图文|并发编程【等待/通知机制】就是这个feel~
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- 凉鞋:我所理解的框架 【Unity 游戏框架搭建】
前言 架构和框架这些概念听起来很遥远,让很多初学者不明觉厉.会产生"等自己技术牛逼了再去做架构或者搭建框架"这样的想法.在这里笔者可以很肯定地告诉大家,初学者是完全可以去做这些事情 ...
- MyBatis框架——动态SQL
MyBatis 作为⼀个“半⾃动化”的 ORM 框架,需要开发者⼿动定义 SQL 语句. 在业务需求⽐较复杂的情 况下,⼿动拼接 SQL 语句的⼯作量会⾮常⼤,为了适⽤于不同的业务需求,往往需要做很多 ...