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的手镯.现在将一些镯子装入背包,求 ...
随机推荐
- 前端面试题-HTML语义化标签
一.HTML5语义化标签 标签 描述 <article> 页面独立的内容区域. <aside> 页面的侧边栏内容. <bdi> 允许您设置一段文本,使其脱离其父元素 ...
- 前端每日实战:52# 视频演示如何用纯 CSS 创作一个小球绕着圆环盘旋的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 此视频是可 ...
- 前端H5,点击选择图片控件,图片直接在页面上展示~
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python基础知识(day1)
day1 1.编码 ASCII码 1字节8位 2^8 = 256 位 万国码 unicode 4字节32位 #浪费空间 UTF-8 对unicode进行压缩 2.注释 单行注释 score = inp ...
- iview中遇到table的坑(已经修改了table的数据,但是界面没有更新)
https://blog.csdn.net/bigdargon/article/details/89381466 https://blog.csdn.net/qiuyan_f/article/deta ...
- 双列集合Map相关面试题
一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...
- 解决unrecognized import path "xxx"
$ export GOPROXY=https://goproxy.io 环境变量配置上面这句即可 https://goproxy.io 是一个goproxy.io这个开源项目提供的公开代理服务. 使用 ...
- 安卓App自动化测试环境
一.appium安装 1.nodejs依赖 2..net framework 3.Appium桌面程序安装 3.1.安装包获取 3.2.安装过程 二.Java_ jdk安装 1.Java_jdk版本说 ...
- 使用Servlet和JSp在浏览器上实现对数据库表的增删改查(新手)
第一步:用户输入网址进入一个登陆界面. 里面要有账号密码输入. 登陆界面链接到登陆的Servlet类中. Servlet类 --> 1.接收参数(账户密码) 2.调用DAO层的 SQL语句 验 ...
- 五分钟了解Consul
Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像.比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有 ...