动态规划算法

经典动态规划(一)找零钱问题

心已入冬 提交于 2019-11-28 19:52:20
前言 :实习期间都在做业务,降低了对算法题编程的练习。回来秋招答笔试题,遇到动归的题做得细碎,所以趁着还有一点时间把经典的动归问题用最通俗的话总结一下,顺便自己也捡捡编程能力。 动态规划的基本概念实际中就是如下几个步骤: a.分析最优解的性质,并刻画结构特征。 b.递归定义的最优解 c.以自底向上或自顶向下的方式计算出最优解 d.根据计算优值得到的信息,构造问题的最优解。 问题描述: 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。 测试样例: n=3,aim=,penny【2,1,4】 返回值为 : 9 解析: 首先,我们从题目中可以得知我们有3种不同面值的货币,和要达到找钱的目标(aim)。 其次,我们可以将找钱的任务划分成如下的小任务。以3种货币种类举例。 大致的想法就是我就用一种货币去凑0~aim的面值。看看当使用一种货币的时候,从0~aim这些面值中每种面值的零钱换钱方法有多少种。之后,我在第一种货币的基础上增加第而种货币,这时候问题就变为使用使用两种货币的时候,从0~aim这些面值中每种面值的的零钱换钱方法有多少种。在这个时候我们会发现,对于一个面值而言,它的换钱的方法是包括两方面。一方面是使用一种货币的进行兑换的方法数量

POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

家住魔仙堡 提交于 2019-11-28 04:58:39
本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj1094) (5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020) (6)最大流的增广路算法(KM算法). (poj1459,poj3436) 三.数据结构. (1)串 (poj1035,poj3080,poj1936) (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388

POJ - 3176 Cow Bowling 动态规划

半城伤御伤魂 提交于 2019-11-27 15:09:07
动态规划:多阶段决策问题,每步求解的问题是后面阶段问题求解的子问题,每步决策将依赖于以前步骤的决策结果。(可以用于组合优化问题) 优化原则:一个最优决策序列的任何子序列本身一定是相当于子序列初始和结束状态的最优决策序列。 只有满足优化原则的问题才可以利用动态算法进行求解,因为只有全局最优解法等于其每个子问题的最优才可以分阶段进行求解。 The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-like triangle like this: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Then the other cows traverse the triangle starting from its tip and moving "down" to one of the two diagonally adjacent cows until the "bottom" row is reached. The cow's score is the sum of the numbers of the cows visited

动态规划之矩阵链乘法

淺唱寂寞╮ 提交于 2019-11-27 13:41:04
矩阵链相乘 矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子。给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 两个矩阵A和B只有相容(compatible),即A的列数等于B的行数时,才能相乘。如果A是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵。计算C所需要时间由第8行的标量乘法的次数决定的,即pqr。 以矩阵链<A1,A2,A3>为例,来说明不同的加括号方式会导致不同的计算代价。假设三个矩阵的规模分别为10×100、100×5和5×50。 如果按照((A1A2)A3)的顺序计算,为计算A1A2(规模10×5),需要做10×100×5=5000次标量乘法,再与A3相乘又需要做10×5×50=2500次标量乘法,共需7500次标量乘法。 如果按照(A1(A2A3))的顺序计算,为计算A2A3(规模100×50),需100×5×50=25000次标量乘法,再与A1相乘又需10×100×50=50000次标量乘法,共需75000次标量乘法。因此第一种顺序计算要比第二种顺序计算快10倍。 矩阵链乘法问题(matrix-chain multiplication problem)可描述如下:给定n个矩阵的链<A1,A2,...,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案

Leetcode-动态规划

醉酒当歌 提交于 2019-11-27 13:23:34
70. 爬楼梯 https://leetcode-cn.com/problems/climbing-stairs/ 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 解: 暴力,如果只有一阶,就只有一种方法;如果只有二阶,就只有两种方法。那么n阶的方法数就等于n-1阶和n-2阶方法数之和。但直接递归,有太多重复计算,超时。O(2 n ) class Solution: def climbStairs(self, n: int) -> int: if n <= 2: return n return self.climbStairs(n-1) + self.climbStairs(n-2) 递归+记忆化,放数组里缓存。把每一步的结果存储在 memo 数组之中,每当函数再次被调用,就直接从 m e m o 数组返回结果 class Solution: def climbStairs(self, n: int) -> int: memo = [0]*(n+1) # memo[i]表示从第i阶到第n阶的方法数,出发点是第0阶 def helper(i, n, memo): # 起始点i,终点n if i > n: # 越界,最高起点直接在第n阶 return 0 if i == n: #

国家集训队论文(较全)

核能气质少年 提交于 2019-11-27 12:19:45
国家集训队1999论文集 陈宏:《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤:《把握本质,灵活运用——动态规划的深入探讨》 齐鑫:《搜索方法中的剪枝优化》 邵铮:《数学模型的建立、比较和应用》 石润婷:《隐蔽化、多维化、开放化——论当今信息学竞赛中数学建模的灵活性》 杨帆:《准确性、全面性、美观性——测试数据设计中的三要素》 周咏基:《论随机化算法的原理与设计》 国家集训队2000论文集 陈彧:《信息学竞赛中的思维方法》 方奇:《动态规划》 高寒蕊:《递推关系的建立及在信息学竞赛中的应用》 郭一:《数学模型及其在信息学竞赛中的应用》 江鹏:《探索构造法解题模式》 李刚:《动态规划的深入讨论》 龙翀:《解决空间规模问题的几种常用的存储结构》 骆骥:《数学模型的建立和选择》 施遥:《人工智能在围棋程序中的应用》 肖洲:《数据结构的在程序设计中的应用》 谢婧:《规模化问题的解题策略》 徐串:《论程序的调试技巧》 徐静:《图论模型的建立与转化》 杨江明:《论数学策略在信息学问题中的应用》 杨培:《非最优化算法初探》 张辰:《动态规划的特点及其应用》 张力:《类比思想在解题中的应用》 张一飞:《冗繁削尽留清瘦——浅谈信息的充分利用》 国家集训队2001论文集 符文杰:《Pólya原理及其应用》 高寒蕊:《从圆桌问题谈数据结构的综合运用》 高岳:《中等硬度解题报告

【算法题】动态规划

独自空忆成欢 提交于 2019-11-27 10:55:52
动态规划一般分为三类问题: 计数 -有多少种方式走到右下角 -有多少种方法选出k个数使得和是Sum 最大最小值 -从左上角走到右下角路径的最大数字和 -最长上升子序列长度 存在性 -取石子游戏,先手是否必胜 -能不能选出k个数使得和是Sum 例题: 给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1. 样例 样例1 输入: [1, 2, 5] 11 输出: 3 解释: 11 = 5 + 5 + 1 样例2 输入: [2] 3 输出: -1 解题步骤如下(以样例1为例): 确定状态。 最后一步(最优策略中使用的最后一枚硬币 \(a_k\) )、化成子问题(最少的硬币拼出更小的面值 \(11-a_k\) )。 转移方程。 \[ dp[X]=min\{ dp[X-2]+1,dp[X-5]+1,dp[X-7+1] \} \] 初始条件和边界条件。 $ dp[0] = 0 $,如果不能拼出Y, $ dp[Y] = INTMAX $ 计算顺序。 $ f[0],f[1],f[2]… $ 来源: https://www.cnblogs.com/lvjincheng/p/11360574.html

算法图解读书笔记 第9章 动态规划

自古美人都是妖i 提交于 2019-11-27 07:16:00
动态规划 将大问题分解成小问题,并先着手解决这些小问题。 9.1 背包问题 9.1.1 简单算法 尝试各种可能的组合,并找出价格最高的组合。 9.1.2 动态规划 先解决小背包的问题,再逐步解决原来的问题。 9.2 背包问题 先解决小问题,在逐步解决大问题 9.3 最长公共子串 9.3.1 绘制网络 9.3.2 填充网络 9.3.3 揭晓答案 9.3.4 最长公共子序列 9.3.5 最长公共自子序列解决方法 9.4 小结 来源: https://blog.csdn.net/weixin_41217899/article/details/99540986

动态规划

两盒软妹~` 提交于 2019-11-27 05:45:25
动态规划 算法总体思想 动态规划算法与分治法类似,其基本思想也是将 待求解问题分解成若干个子问题 。 但是经分解得到的 子问题往往不是互相独立 的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。 如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。 动态规划基本步骤: (1)找出最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造最优解。 实例一、完全加括号的矩阵连乘积 问题可递归定义: (1)单个矩阵是完全加括号的; (2)矩阵连乘积A是完全加括号的 ,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即 A = (BC)。 设有四个矩阵A,B,C,D它们的维数分别是: A = 50*10 , B = 10*40 , C = 40*30 , D = 30*5 总共有五中完全加括号的方式: 例如:((A(BC))D): 10 * 40 * 30 + 10 * 30 * 50 + 50 * 30 * 5 = 34500 给定矩阵{A1, A2, A3,..., An},其中Ai与A(i+1)是可乘的。i = 1,2,3, ..., n - 1。考察这n个矩阵的连乘积A1*A2*A3...An.

算法设计

不羁的心 提交于 2019-11-27 03:55:47
一、分治法 递归,找最大值最小值,整数相乘,归并排序,快速排序,线性时间选择,最近点对问题 二、动态规划   0-1背包问题 ,矩阵相乘问题,装配线调度问题,最长公共子序列,最优二分检索树,凸多边形最优三角剖分 三、贪心法   背包问题,活动选择问题,哈夫曼编码,最小生成树算法(Kruskal 和 Prim) 四、回溯法   n皇后问题,子集和数问题,0-1背包问题,旅行商问题,着色问题 五、图算法   图的表示,广度优先搜索,Dijkstra算法 来源: https://www.cnblogs.com/eaglezb/p/11343106.html