算法导论 16.1 活动选择

  写在前面。

  最近事也挺多,准备论文,准备科一,还要刷算导。慢慢来吧。

  章节介绍

  活动选择

  1. 介绍了这个问题

  2. 利用动态规划,给出递归式

  证明了其具有最优子结构,证明需要再体会。

  3. 定理16.1证明了:最早结束的活动,总是最优解的一部分。

  4. 递归代码

  5. 迭代代码

 

  课后习题

  16.1-1:

  需要练代码的能力

  16.1-2:

  类似定理16.1可得出。

  另外,选择最早开始的活动,在证明中得不出活动会不交叉,自然证明不下去。

  16.1-3:

  具体例子不给出。

  16.1-4:

  没想出证明(需要继续看)

  16.1-5:

  同上一题

   

  读后思考

  通过习题2,3得出疑问,对于一个问题,怎么样选择贪心的策略可以保证贪心算法的正确性?

  自己的思考,需要给出最优子结构,之后设计递归,然后看能不能将问题缩小,分成两个部分,一个解,后面的子问题。证明这个解仍然在最优解中,上述的选择是安全的。在16.2节中,书中也给出了贪心算法的设计的过程。

 

时间: 2024-10-22 01:39:42

算法导论 16.1 活动选择的相关文章

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[

算法导论 16.1-1

用动态规划方法求解活动选择问题,与贪心算法相比,显然是庞然大物,大材小用了,贪心算法可以非常简洁的求解活动选择问题 动态规划: 1 #include <iostream> 2 #include <vector> 3 #include <limits> 4 #define INF numeric_limits<int>::max() 5 using namespace std; 6 int act_select(int s[],int f[],int n,in

算法导论.pdf

下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受.全书各章自成体系,可以作为独立的学习单元:算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂:说明和解释力求浅显易懂,不失深度和数学严谨性. 全书选材经典.内容丰富.结构合理.逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教

《算法导论》读书笔记(七)

前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解.书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析.本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测试验证.关于贪心算法的详细分析过程,下次在讨论. 1.活动选择问题描述   有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用.每个活动ai都有

算法导论笔记——第十六章 贪心算法

通常用于最优化问题,我们做出一组选择来达到最优解.每步都追求局部最优.对很多问题都能求得最优解,而且速度比动态规划方法快得多. 16.1 活动选择问题 按结束时间排序,然后选择兼容活动. 定理16.1 考虑任意非空子问题Sk,令am是Sk中结束时间最早的活动,则am在Sk的某个最大兼容活动子集中. 16.2 贪心算法原理 设计贪心算法步骤: 1>将最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解. 2>证明作出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的. 3

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

[算法导论]练习16.1-4 活动教室分配(区间着色问题)

题目: 有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室完成所有活动. 设计一个高效的贪心算法求每个活动应该在哪个教室进行. 分析: 本题是对书中活动选择问题的一个扩展.在活动选择问题中,我们要求的是一个最大兼容活动集,也就是在所有时间内时间不重叠的最多的活动集合. 易知,这样一个活动集,就是一个教室最多能够举办的活动集.所以剩下的活动一定不能和该活动集内的活动在同一个教室举行.我们不断对剩下的活动使用贪心算法,需要多少次贪心能够选取完所有的活动,就

算法导论贪心算法之活动选择

活动选择问题的递归调用算法 #include<iostream> using namespace std; #define N 11 struct node{ int id; int satrt; int end; }A[N+1]; void recursive_activity_seclect(int k,int n) { int m=k+1; while(m<=n&&A[m].satrt<A[k].end) m=m+1; if(m<=n) { cout&l