经典贪心法:时间序列问题及其全局最优性证明
贪心算法是指在对问题求解时,总做出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解。一旦贪心算法求出了一个可行解,就要确定这个算法是否找到了最优解。为此,要么证明这个解是最优的,要么说明一个该算法产生非最优解的反例。
为了更方便的说明问题,我们来拿一个实例做分析,下面的题目取自HDU_2037:今年暑假不AC
Problem Description “今年暑假不AC?” “是的。” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。 作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。 Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0 Sample Output 5
仔细考察问题(自己举一些简单的例子来找规律)后我们发现:在算法的每个阶段,都从可以完整收看的节目中选择一个最早结束的节目观看。我们将证明在从能看尽量多的完整节目的意义上而言,这种贪心算法是一种最优算法。为了证明该算法的最优性,对变量n应用数学归纳法,其中n是算法中的节目数。设P(n)是命题:如果贪心算法安排了n个节目,那么不可能安排更多的节目。
基础步骤:设应用上述贪婪算法只安排了1个节目(Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间),这说明所有其他的节目的开始时间都在安排的那1个节目的结束时间T1_e之前,并且结束时间T1_e <= Ti_e。这又说明了什么?说明任意两两节目的播出时间都有重叠,因此如果贪心算法安排了1个节目,那么不可能安排更多的节目。
归纳步骤:归纳步骤是P(k)为真,其中k是一个正整数。也就是说,如果贪心算法安排了k个节目,那么不可能安排更多的节目。下面我们需要证明在k成立的条件下,命题对k+1仍然成立。换句话说,假设贪心算法安排了k+1个节目,那么我们需要证明不能安排更多的节目了。我们以安排尽量多的节目为出发点,那么第一个节目应该是最早结束的那个,因为所有节目的开始和结束时间都已经给定了,因此要想尽可能多的安排节目我们需要在安排了第一个节目后使剩下的时间最大化,即第一个节目是众多节目中最早结束的那个能保证安排节目的数量达到最大化。剩下的问题就好办了,剩下的时间安排k个节目已经由我们的归纳假设P(k)保证了。
OK,我们已经完成了基础步骤和归纳步骤,根据数学归纳法的原理可知:对所有正整数n,P(n)为真。这就完成了最优性的证明。
确定了对于该问题使用贪心法能保证找到一个最优解后,我们可以踏踏实实地编写程序来实现了:
#include<stdio.h> #include<string.h> void bubble_sort(int a[][2], int); // 注意二维数组做形参的写法 int main(void) {int n, i, count, first, second;int a[110][2];while(scanf("%d", &n) && n) // n==0,输入结束 {i = 0;memset(a, 0, sizeof(a));while(n--){scanf("%d%d", &a[i][0], &a[i][1]);i++;}bubble_sort(a, i); // i为数据的个数// 排好序后,从最早结束的开始,找第二早结束的,如果满足前者结束时间<=后者开始时间,观看节目数加一,重复上述过程,直至遍历完所有给出的节目数据。 count = 1;first = 0;second = 1;while(1) {if(a[first][1] <= a[second][0]){count++;first = second;}second++; if(second >= i)break; }printf("%d\n", count); } return 0; }void bubble_sort(int a[][2], int n) {int temp;for(int outer = n-1; outer > 0; outer--)for(int inter = 0; inter < outer; inter++){if(a[inter][1] > a[inter+1][1]){temp = a[inter][1];a[inter][1] = a[inter+1][1];a[inter+1][1] = temp;temp = a[inter][0];a[inter][0] = a[inter+1][0];a[inter+1][0] = temp;}} }
All Rights Reserved. Author:海峰:) Copyright © xp_jiang. 转载请标明出处:http://www.cnblogs.com/xpjiang/p/4413903.html以上.
转载于:https://www.cnblogs.com/xpjiang/p/4413903.html
经典贪心法:时间序列问题及其全局最优性证明相关推荐
- 【数据结构和算法设计】算法篇(7) 贪心法
文章目录 7.1 贪心法概述 7.1.1 什么是贪心法 7.1.2 用贪心法求解的问题应具有的性质 1. 贪心选择性质 2. 最优子结构性质 7.1.3 贪心法的一般求解过程 7.2 求解活动安排问题 ...
- 算法入门到进阶(贪心法)
文章目录 基本概念 应用规则 解析 源码 测试 归纳 贪心法适用特征 最优子结构性质 贪心选择性质 贪心法使用常见问题 区域覆盖问题 最优装载问题 多及调度问题 活动安排问题 源码 测试 基本概念 贪 ...
- 算法设计与分析之贪心法
文章目录 前言 一.贪心法设计思想 二.贪心法的基本要素 三.贪心法的优缺点 四.贪心法的设计步骤 五.贪心法示例 总结 前言 大家好,越努力,越幸运,我是程序猿小猿.本篇文章小猿将跟您分享算法设计与 ...
- 揭秘深度学习成功的数学原因:从全局最优性到学习表征不变性
来源:机器之心 本文长度为4900字,建议阅读7分钟 本文为深层网络的若干属性,如全局最优性.几何稳定性.学习表征不变性,提供了一个数学证明. 近年来,深度学习大获成功,尤其是卷积神经网络(CNN)在 ...
- 学渣的刷题之旅 leetcode刷题 53.最大子序和(动态规划,贪心法)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4, ...
- 《c陷阱与缺陷》之贪心法
在词法分析中,有条规则:每个符号应该包含尽可能多的字符,被称为"贪心法"或"大嘴法". K&R表述如下:如果(编译器的)输入流截止至某个字符之前都已经被 ...
- 贪心问题JAVA_java背包问题(贪心法)
完全背包问题 一个旅行者有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,每件的价值分别为C1,C2,...,Cn.若的每种物品的件数足够多.求旅行者能获得的最大总 ...
- 【LeetCode笔记】55. 跳跃游戏(Java、贪心法)
文章目录 题目描述 解法 & 思路 题目描述 可以用动态规划来做,dp[i]代表以第i个下标做起点,可以到达的最远的地方,从后往前走,最后dp[0] >= len-1说明可达. 不过我的 ...
- 1214线段覆盖问题——贪心法
题目描述: 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,--N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖. ...
最新文章
- vim学习笔记(一)
- 看看函数名和注释,AI就能自动生成代码,程序员:这不真实,我要失业
- mysql 按小时分组统计_PowerBI业务分析:按排名分组统计
- pandas语法乱、API多?你需要整理一下!|知乎讨论
- Dubbo 跨语言调用神兽:dubbo-go-pixiu
- linux内核模块开发
- CF1237F Balanced Domino Placements(dp+组合计数)
- python嵌套列表操作_python基础(list列表的操作,公共方法,列表嵌套,元祖)...
- 【Python】IDLE工具
- 在linux上使用ASP
- ef mysql 分页查询语句_MySQL、Oracle和SQL Server的分页查询语句
- oracle -00257
- 2021-03-19
- 统计推断——假设检验中 p 值的含义具体是什么?
- 前端开发公众号的调试
- 俞敏洪励志演讲稿【二】
- 数据挖掘算法和实践(四):支持向量机(iris鸢尾花数据集)
- CountDownTimer 一步实现最简单的倒计时控件
- 一文看懂Linux内核的整体架构
- java愤怒的小鸟代码_java 愤怒的小鸟(flybird)源码