题目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. 前端面试题-HTML语义化标签

    一.HTML5语义化标签 标签 描述 <article> 页面独立的内容区域. <aside> 页面的侧边栏内容. <bdi> 允许您设置一段文本,使其脱离其父元素 ...

  2. 前端每日实战:52# 视频演示如何用纯 CSS 创作一个小球绕着圆环盘旋的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 此视频是可 ...

  3. 前端H5,点击选择图片控件,图片直接在页面上展示~

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Python基础知识(day1)

    day1 1.编码 ASCII码 1字节8位 2^8 = 256 位 万国码 unicode 4字节32位 #浪费空间 UTF-8 对unicode进行压缩 2.注释 单行注释 score = inp ...

  5. iview中遇到table的坑(已经修改了table的数据,但是界面没有更新)

    https://blog.csdn.net/bigdargon/article/details/89381466 https://blog.csdn.net/qiuyan_f/article/deta ...

  6. 双列集合Map相关面试题

    一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...

  7. 解决unrecognized import path "xxx"

    $ export GOPROXY=https://goproxy.io 环境变量配置上面这句即可 https://goproxy.io 是一个goproxy.io这个开源项目提供的公开代理服务. 使用 ...

  8. 安卓App自动化测试环境

    一.appium安装 1.nodejs依赖 2..net framework 3.Appium桌面程序安装 3.1.安装包获取 3.2.安装过程 二.Java_ jdk安装 1.Java_jdk版本说 ...

  9. 使用Servlet和JSp在浏览器上实现对数据库表的增删改查(新手)

    第一步:用户输入网址进入一个登陆界面. 里面要有账号密码输入. 登陆界面链接到登陆的Servlet类中. Servlet类 --> 1.接收参数(账户密码)  2.调用DAO层的 SQL语句 验 ...

  10. 五分钟了解Consul

    Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像.比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有 ...