贪心算法

贪心算法之买卖股票的最佳时机 II

血红的双手。 提交于 2020-01-26 18:14:17
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: 输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock

动态规划和贪心算法的区别

旧巷老猫 提交于 2020-01-26 02:39:23
动态规划和贪心算法的区别 动态规划和贪心算法都是一种递推算法 均有局部最优解来推导全局最优解 不同点: 贪心算法: 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。 动态规划算法: 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解 3.边界条件:即最简单的,可以直接得出的局部最优解 ============================================================================== 贪心算法与动态规划 贪心法的基本思路: 从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。 该算法存在问题: 1. 不能保证求得的最后解是最佳的; 2. 不能用来求最大或最小解问题; 3. 只能求满足某些约束条件的可行解的范围。实现该算法的过程: 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解

PTA刷题日志 2020/1/14

落爺英雄遲暮 提交于 2020-01-25 15:40:42
第一题:1033 To Fill or Not to Fill (25分) 这个是个贪心算法,我想到就是不断找最便宜的且最近的车站,但是这个还要涉及,如果下一个应该去的最便宜的车站价格比当前车站贵,应该加满,涉及有点复杂。 待完善。 第二题:1037 Magic Coupon (25分) 这个题属实是一个简单贪心算法,但是我一开始用set保存,利用了set的自排序,但是忽略了不可以重复,所以改为multiset通过 来源: CSDN 作者: 如椽大笔_S686 链接: https://blog.csdn.net/ZiYuTongXue/article/details/103969276

LeetCode刷题之贪心算法(2)

佐手、 提交于 2020-01-25 08:21:36
LeetCode 605 种花问题 https://leetcode-cn.com/problems/can-place-flowers/ 题目描述: 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。 可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花), 和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花? 能则返回True,不能则返回False。 输入: flowerbed = [1,0,0,0,1], n = 1 输出: True 输入: flowerbed = [1,0,0,0,1], n = 2 输出: False * 数组内已种好的花不会违反种植规则。 * 输入的数组长度范围为 [1, 20000]。 * n 是非负整数,且不会超过输入数组的大小。 思路 : 对于这道题来说,因为已经种好的花不会违反种植规则,所以对于每一个1,都有紧跟的0位置,可以跳过,所以,当当前位置值为1时,i = i+2; 而当当前位置为0时,前面肯定是0或者是起始位置,所以只需要看下一个位置的值,这个时候有一个临界条件,如果当前位置是数组末尾,此时是可种植的,如果不是,那么就需要看下一个位置的值,若是0,则可以种植,此时 i=i+2,若是1,则不能种植, i = i+1,到下一个位置。

动态规划与贪心的区别

[亡魂溺海] 提交于 2020-01-24 20:40:25
转自 : http://hi.baidu.com/abcdcamey/item/0d1d6746c9ef4616896d10ac 动态规划和贪心算法的区别 动态规划和贪心算法都是一种递推算法 均有局部最优解来推导全局最优解 不同点: 贪心算法: 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。 动态规划算法: 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解 3.边界条件:即最简单的,可以直接得出的局部最优解 ============================================================================== 贪心算法与动态规划 贪心法的基本思路: 从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。 该算法存在问题: 1. 不能保证求得的最后解是最佳的; 2. 不能用来求最大或最小解问题; 3. 只能求满足某些约束条件的可行解的范围。实现该算法的过程:

算法笔记--贪心

喜夏-厌秋 提交于 2020-01-24 15:53:11
1、简单贪心 利用局部最优来求解全局最优的方法,并利用反证法或者数学归纳法加以推理。 例题:【PAT B1020】月饼 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。 输入格式: 每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。 输出格式: 对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。 输入样例: 3 20 18 15 10 75 72 45 输出样例: 94.50 思路: 总是选择单价最高的月饼出售,可以获得最大的利润 从单价高的月饼开始枚举 注意数据类型 无法为 来源: https://www

贪心算法和动态规划算法

Deadly 提交于 2020-01-23 13:30:25
动态规划和贪心算法都是一种递推算法 即均由局部最优解来推导全局最优解 ( 不从整体最优解出发来考虑, 总是做出在当前看来最好的选择。) 不同点: 贪心算法 与动态规划的区别: 贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留。 能使用贪心法求解的条件 :是否能找出一个贪心标准。我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角、五分和一分,求最小找币数时,可以用贪心法求解;如果将这三种币值改为一角一分、五分和一分,就不能使用贪心法求解。 例:贪心法标准的选择 设有n个正整数,将它们连接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。 又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。 输入:n 个数 输出:连成的多位数 算法分析:此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。按这种标 准,我们很容易找到反例:12,121应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如12,123就是 12312而非12123,这种情况就有很多种了。是不是此题不能用贪心法呢? 其实此题可以用贪心法来求解

Java数据结构与算法精讲

被刻印的时光 ゝ 提交于 2020-01-23 03:19:40
课程简介 本系列视频教程为数据结构与算法基础,使用java语言描述,适合没有学过C/C++有一定Java基础的同学。没有Java基础的同学可以先行学习Java基础。 课程目录 ├─线性表 ├─栈和队列 ├─HashMap和LinkedHashMap ├─树 ├─二叉树 ├─图 ├─图的遍历与最小生成树 ├─图的最短路径与拓扑排序 ├─算法简介 ├─算法排序 ├─排序与归并 ├─递归与穷举 ├─贪心和分治 ├─动态规划和回溯 来源: CSDN 作者: di_pingxian 链接: https://blog.csdn.net/di_pingxian/article/details/103897423

python算法之贪心算法

佐手、 提交于 2020-01-22 18:19:30
前言 贪心算法在解决问题时总想着用当前看来最好的方法来实现。其不从整体最优上考虑问题,仅考虑某种意义上的局部最优来求解问题。贪心算法的有点是: 当面对范围比较大的问题时,能产生整体最优解或整体最优解的近似值。 贪心算法的存在问题 不能保证最后的解是最优的。 不能用来求最大解或者最小解问题。 只能求满足某种约束条件的可行解的范围。 贪心算法的基本思路 建立数学模型来描述问题。 把求解的问题分解成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。 把子问题的局部最优解合并成原来问题的一个解。 实现算法基本过程 从问题的某一初始解出发。 while能向给定总目标前进一步。 求出可行解的一个解元素。 由所有解元素组合成问题的一个可行解。 案例 解决“找零”问题 假设只有1分,2分,5分,1角,2角,5角,1元面值的硬币。在超市结账找零时,收银员希望将最少的硬币数找给顾客,那么给定找零的零钱数目,如何求得最小的硬币数 ? def look ( ) : d = [ 0.01 , 0.02 , 0.05 , 0.1 , 0.2 , 0.5 , 1.0 ] #存储每种硬币的面值 d_num = [ ] #存储每种硬币的数量 s = 0 #拥有零钱的总钱 temp = input ( '请输入每种零钱的数量(以空格为区分)' ) d_num0 = temp . split ( ' ' )

和最大子序列(贪心)

人走茶凉 提交于 2020-01-22 08:48:31
问题 1508: [蓝桥杯][算法提高VIP]和最大子序列 时间限制: 1Sec 内存限制: 128MB 提交: 487 解决: 160 题目描述 对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。 输入 输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。 其中 1 < = N < = 100000 -10000 < = A[i] < =  10000 输出 输出仅包含一个整数,表示你算出的答案。 样例输入 5 3 -2 3 -5 4 样例输出 4 #include <iostream> #include <algorithm> using namespace std; const int Max=105; int main() { int n,_max=INT_MIN,sum=0;//当前最大 int dp[Max]; cin>>n; for(int i=0;i<n;i++) cin>>dp[i]; for(int i=0;i<n;i++) { sum+=dp[i];//连续叠加 _max=max(sum,_max); if(sum<0) sum=0;//说明这个点绝不可能是最大子序列的起点