动态规划-带权区间问题

摘要:
这个递推公式允许我们从某些更小的子问题的解来确定一个子问题的解。

一、动态规划算法的定义:

为了着手开发一个动态规划算法,我们需要一组从初始问题导出的满足某些基本性质的子问题。

  1. 只存在多项式个子问题
  2. 可以容易的从子问题的解计算出初始问题的解
  3. 在子问题中,从“最小”到“最大”存在一种自然的顺序,与一个容易计算的递推公式相联系。这个递推公式允许我们从某些更小的子问题的解来确定一个子问题的解。

二、带权区间调度问题:

我们有N个需求,标记为1,2,3,......,N,每个需求指定一个开始时间si,结束时间fi,每个需求i有一个权值vi,如果两个需求不重叠,那么他们是相容的。

目标:选择一个两两相容的子集动态规划-带权区间问题第1张,使得动态规划-带权区间问题第2张最大。

三、动态规划算法:

首先让所有的需求按照结束时间非降序排序:f1<=f2.....<fn

定义p(j) 为使得区间i与j不相交的最大的标记,既i是最右边的在j开始之前的区间。

设最优解为O,则显然对每个区间都有:动态规划-带权区间问题第3张

令区间{1,2,3,......,j}的最优解为OPT(j)

则:

OPT(j) = MAX( vj+ OPT(p(j)), OPT(j-1))

并且需求j属于OPT(j),当且仅当:

OPT(p(j)) + vj>= OPT(j-1)

动态规划算法如下:

  1. 求出所有的OPT(j)

其中数组M用于存储OPT(j)

M-Comupte-OPT(j)

If j == 0 then

Return 0

Else if M[j] 不为空 then

Return M[j]

Else

M[j] = MAX( vj+ Comupte-OPT(p(j)), Comupte-OPT(j-1))

Return M[j]

End

2. 根据上一步求出的OPT[j],求出最优解中包含的区间

Find-Solution(j)

If j == 0 then

Return “”;

Else

If OPT(p(j)) + vj>= OPT(j-1) then

Return j + Find-Solution(p(j))

Else

Return Find-Solution(p(j))

End

End

免责声明:文章转载自《动态规划-带权区间问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇跳转页面的三种方式基于335X的UBOOT网口驱动分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

牛客网2017校招真题在线编程之合唱团问题——动态规划问题首秀

先贴题目 题目描述 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 输入描述: 每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数...

【动态规划】闫氏dp分析

来源于Acwing yxc的闫氏dp分析讲解,本文为几道经典例题的笔记 目录 53. 最大子序和 120. 三角形最小路径和 91. 解码方法 62. 不同路径 63. 不同路径 II 198. 打家劫舍 72. 编辑距离 53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...

Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)

描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词(两个单词不能共享第一个字母),将每一段中的单词个数相加,求最大值. 1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s...

笔试算法题(44):简介

议题:动态规划(Dynamic Programming) 分析: DP主要用于解决包含重叠子问题(Overlapping Subproblems)的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存最简单子问题的解,然后逐步合并成为原问题的解,由于需 要查询子问题的解,所以需要一个表格记录子问题的解;DP仅适用于最优子结构问题(Optim...

数据结构 练习 19-活动选择问题的实现(动态规划 和 贪心)

问题叙述:如下图表示活动的开始和结束时间,s[i],开始时间;f[j]结束时间。现在要进行一些列如下活动,注意每个时间段只能进行一场活动,也就是活动不能同时进行,要求举行的活动次数最多。求调度方法。 老规矩,动态规划,要找出两个问题: 1,子问题的最优解; 2,子问题是什么。 abviously,本问题的最优解为:活动数的次数最多,子问题是:看递推公式...

A Mini Locomotive(动态规划 01)

 /*  题意:选出3个连续的 数的个数  为K的区间,使他们的和最大 分析: dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]);   dp[j][i]:从j个数种选出i个连续区间  数值的最大和 value[j]:第j个区间内的数的和 和背包有点像,但要活用   */   #include <cstdio...