动态规划

算法第三章作业

三世轮回 提交于 2019-12-02 16:54:42
动态规划算法的理解: 一、含义 动态规划:多阶段(两段)最优化决策解决问题的过程就称为动态规划。 二、基本步骤 1、描述优解的结构特征。 2、递归地定义一个最优解的值。 3、自底向上计算一个最优解的值。 4、从已计算的信息中构造一个最优解。 三、何时采用动态规划 (1) 最优化原理:问题的最优解包含的字问题也有最优解,就称该问题具有最优子结构,满足最优化原理。 (2)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(处理重叠子问题是动态规划的优势所在) 四、例题 (1) 题目: 思路:很明显要用dp来做。我们以dp[ ]数组(假设现在是dp[ x ])记录此时以 x 为结尾的最长单调递增子序列的长度,a[ ]数组记录初始数据。 则可以得到状态转移方程 : 1 for(int i=1;i<n;i++){ 2 for(int j=0;j<i;j++){ 3 if(a[i]>a[j]&&dp[i]<dp[j]+1){ 4 dp[i]=dp[j]+1; 5 } 6 } View Code AC代码: 1 #include<iostream> 2 using namespace std; 3 int n,max,temp,cnt; 4 int dp[1050],a[1050]; 5 int find(){ 6 int temp=0; 7 for(int i

动态规划-----分隔等和数组

橙三吉。 提交于 2019-12-02 16:41:42
/*** * 问题:分割等和子集 * 解决方法:动态规划、递归法: * 1、建立状态 * 2、状态转移方程 * 第一步、先求出和,判断其是否可以被2整除 * 第二步、for循环的确定dp * 递归法:时间会超时,函数的调度太大 * 动态规划:相当于背包的问题 * 在数组中找到一些数值去填充target * 从而可以确定状态boolean dp[i]表示target为i时用数组中的元素是否可以被填满 * 进一步的确定状态转移方程dp[j]=dp[j-i];表示如果dp[j-i]可以被填满则dp[j]也可以被填满 * java: * class Solution { private int target=0; public boolean canPartition(int[] nums) { for(int i=0;i<nums.length;++i) target+=nums[i]; if(target%2!=0)return false; target=target>>1; return dfs(nums,0,target); } public boolean dfs(int[] nums,int index,int target) { if(target==0)return true; else if(target<0)return false; for(int i=index

C语言常用算法

自古美人都是妖i 提交于 2019-12-02 14:32:23
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

动态规划——扰乱字符串问题

Deadly 提交于 2019-12-02 12:45:42
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。 下图是字符串 s1 = “great” 的一种可能的表示形式。 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。 例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。 我们将 "rgeat” 称作 “great” 的一个扰乱字符串。 同样地,如果我们继续交换节点 “eat” 和 “at” 的子节点,将会产生另一个新的扰乱字符串 “rgtae” 。 我们将 "rgtae” 称作 “great” 的一个扰乱字符串。 给出两个长度相等的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。 示例 1: 输入: s1 = “great”, s2 = “rgeat” 输出: true 示例 2: 输入: s1 = “abcde”, s2 = “caebd” 输出: false 题目详细解析 来源: https://blog.csdn.net/qq_39690007/article/details/102761456

动态规划_POJ1775:采药

柔情痞子 提交于 2019-12-02 12:29:45
1775:采药 总时间限制:1000ms;内存限制: 65536kB 描述 辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗? 输入 输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采摘某株草药的时间和这株草药的价值。 输出 输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。 样例输入 70 3 71 100 69 1 1 2 样例输出 3————————————————————————————————————————————————————————————————————————————小半年没写DP了,连个01背包都不会写了。。。。好叭也不是时隔太久的原因,而是之前就没学到家orz就直接上代码了

动态规划 - OJ1768最大子矩阵

人走茶凉 提交于 2019-12-02 12:22:36
题目来源:http://noi.openjudge.cn/ch0206/1768/ 1768:最大子矩阵 总时间限制: 1000ms;内存限制: 65536kB 描述: 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15。 输入: 输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N 2 个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。 输出: 输出最大子矩阵的大小。 来源 翻译自 Greater New York 2001 的试题 ———————————————————————————————————————————————— 刚拿到这道题的时候是有点懵逼的,因为对于二维结构想不到最优子结构,更想不到状态转移方程。 但是既然二维有困难,那么我们可以先把它转化为一维的结构。 铺垫:先想如何找一行一维数组的最大连续元素和呢? 重点是这个状态转移方程: b[i] = max {

LeetCode—64.最小路径和(Minimum Path Sum)——分析及代码(C++)

点点圈 提交于 2019-12-02 11:38:29
LeetCode—64.最小路径和[Minimum Path Sum]——分析及代码[C++] 一、题目 二、分析及代码 1. 动态规划 (1)思路 (2)代码 (3)结果 三、其他 一、题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/minimum-path-sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 二、分析及代码 1. 动态规划 (1)思路 由于每次只能向下或向右移动一步,对各个位置的最小数字和: 1)第 1 行或第 1 列:之前所有数字之和; 2)其他位置:左边 或 上边 中较小的数字和 + 当前数字。 据此可以完成动态规划解法。 (2)代码 class Solution { public : int minPathSum ( vector < vector < int >> & grid ) { if ( grid . empty ( ) ) return 0 ; int m = grid .

『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

本秂侑毒 提交于 2019-12-02 11:27:18
本文索引目录: 一、动态规划的基本思想 二、数字三角形、最大子段和(PTA)递归方程 三、一道区间动态规划题点拨升华动态规划思想 四、结对编程情况 一、动态规划的基本思想:   1.1  基本概念:     动态规划算法简单说,利用拆解问题思想,定义问题状态和状态之间的关系,使得问题能够以递推或者是分治的方式去解决。   动态规划算法的基本思想与分治法很相似,将待求解的问题分解为若干个子问题,前一子问题的解,为后一子问题的求解所依赖。 在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。   1.2  使用条件:   (1) 具有最优子结构 。 具有最优子结构也可能是适合用贪心的方法求解。 注意要确保我们考察了最优解中用到的所有子问题。 1、证明问题最优解的第一个组成部分是做出一个选择; 2、对于一个给定问题,在其可能的第一步选择中,你界定已经知道哪种选择才会得到最优解。你现在并不关心这种选择具体是如何得到的,只是假定已经知道了这种选择; 3、给定可获得的最优解的选择后,确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间; 4、证明作为构成原问题最优解的组成部分,每个子问题的解就是它本身的最优解。方法是反证法,考虑加入某个子问题的解不是其自身的最优解

LeetCode 初级动态规划问题

爱⌒轻易说出口 提交于 2019-12-02 11:12:48
LeetCode 初级动态规划问题 “动态规划”的步骤 分治法的精髓: 基本思想与策略编辑: 爬楼梯 T:2019/10/24 W:0 12:50:21 解 买卖股票的最佳时机 T:2019/10/24 W:0 12:50:21 解 最大子序和 `T:2019/10/25 W:5 10:19:17` 解 打家劫舍 `T:2019/10/25 W:5 13:41:9` 解 “动态规划”的步骤 “动态规划”的两个步骤思考:“状态”以及“状态转移方程”。 有的资料又将“动态规划”分为 3 步: base case :思考问题规模最小的时候,是什么情况; update function :自下而上思考这个问题,即上面的“状态转移方程”; goal :重点强调了输出是什么,很多时候输出并不一定是最后一个状态。 分治法的精髓: Ref: 分治法 分治法的精髓在于: 分 :将问题分解为规模更小的子问题; 治 :将这些规模更小的子问题逐个击破; 合 :将已解决的子问题合并,最终得出“母”问题的解; 分治法适用于: 该问题的规模缩小到一定的程度就可以容易地解决 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 基本思想与策略编辑: 由于

第三章作业

随声附和 提交于 2019-12-02 10:55:27
1. 你对动态规划算法的理解(2分) 定义: 与分治法类似,动态规划的思想也是将一个原问题拆分成若干个子问题,而与分治法不同的是这些子问题互相有关联,这种关联是后一个子问题的解依赖前一个子问题的解。动态规划的过程更像是一个多阶段的决策过程,在求解任何一个子问题时(每一个子问题相当于一个阶段),列出各种可能的局部解,通过决策保留那些可能达到最优的局部解,丢弃其他的局部解,依次解决每一个子问题,最后一个子问题的解就是原问题的解。下面我们通过数字三角形这个例子来说明一下这个定义。 给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。 原问题: 以7为顶的数字三角形,求它从顶至底的一条最优路径。 拆分成若干个子问题: Max(以3为顶的数字三角形,以8为顶的数字三角形)+7。 这时我们可以发现以3为顶的数字三角形又可以拆分成Max(以8为顶的数字三角形,以1为顶的数字三角形)+3。 一直拆分拆分至最后一行(边界条件)无法再拆分。 子问题间的关联性: 从上一步我们可以看到以3为顶的数字三角形的解依赖以8为顶的数字三角形和以1为顶的数字三角形的解。 而所谓的决策过程: 以3为顶的数字三角形又可以拆分成Max(以8为顶的数字三角形,以1为顶的数字三角形)+3