动态规划

算法第三章作业

自闭症网瘾萝莉.ら 提交于 2019-12-03 06:38:35
1.对动态规划的理解 经过第三章动态规划的学习,我了解到动态规划的思想与分治法十分相似,基本思想是将待求解问题分解成若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解。但是动态规划求解的问题经分解得到的子问题往往不是互相独立的。动态规划算法适用于解最优化问题,可按照以下四个步骤:1.找出最优解的性质,并刻画其结构特征;2.递归地定义最优值3.以自底向上的方式计算最优值;4.根据计算最优值时得到的信息,构造最优解。 2.最长递增子序列 m[i] = max{m[k]+1 | a[k]<a[i]}(1<=k<i) 租用游艇 m[i] = min{c[i][k]+m[k[} (i<k<=n) 表示第i到终点的最小费用 3.结对编程情况 通过结对编程,解决了一些bug,运用动态规划不同得递归方程去实现问题的解答。 来源: https://www.cnblogs.com/jiayi25/p/11780948.html

dp(动态规划之最佳路径+dfs)

99封情书 提交于 2019-12-03 05:18:57
http://acm.hdu.edu.cn/showproblem.php?pid=1078 FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17910 Accepted Submission(s): 7619 Problem Description FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid between 0 and 100 blocks of cheese in a hole. Now he's going to enjoy his favorite food. FatMouse begins by standing at location (0,0). He eats up the cheese where

算法第三章作业

为君一笑 提交于 2019-12-03 04:35:23
1、 我 对动态规划算法的理解 (1)基本概念: 动态规划算法通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推/分治的方式解决。 (2)基本思想: 与分治法类似,把一个大的问题进行拆分,细分成一个个小的子问题,且能够从这些小的子问题的解当中推导出原问题的解。同时还需要满足以下两个重要性质: ①最优子结构性: 即所拆分的子问题的解是最优解; ②子问题重叠性质: 在求解的过程中,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。 2、 编程题1、2的递归方程 (1) 单调递增最长子序列 m[i] = max { m[k] + 1 | a[k] < a[i] } ( 1 <= k < i ) 代码实现部分: int length(int a[],int b[],int n) { for (int i=1;i<n;i++) { for (int j=0;j<i;j++) { if (a[j]<a[i]&&b[j]>=b[i]-1) { b[i]=b[j]+1; } } } int t=b[0]; for (int k=0;k<n;k++) { if (b[k]>t) { t

算法题--上台阶

╄→гoц情女王★ 提交于 2019-12-03 04:26:07
上台阶 有一楼梯共n级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上n级,共有多少走法?注:规定从一级到一级有0种走法。给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。 方法一:递归分治 递归分治就是把一个大的问题切分成k个小的子问题,子问题相较于原问题独立又有联系,然后递归地解决这些子问题,再把这些子问题合并得到原问题的答案。 思路:可以走一步,也可以走两步,从第n-1阶再走一步能到第n阶,从第n-2阶一次走两步能到第n阶。 所以,f(n)=f(n-1)+f(n-2) public class GoUpstairs { //递归 public static int countWays(int n) { if(n == 1) return 0; if(n == 2) return 1; if(n == 3) return 2; if(n > 3) return countWays(n-1) + countWays(n-2); return 0; } 方法二:动态规划 动态规划是把待求解问题分解成一个个子问题,原问题由交叠的子问题所构成,即他们存在递推关系,求出较小的子问题从而逐步递推出原问题的答案。 思路:f(1)=0,f(2)=1,f(3)=2, 已知存在这样的关系:f(n)=f

算法第三章作业

坚强是说给别人听的谎言 提交于 2019-12-03 04:20:03
一、对动态规划算法的理解   动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。   个人感觉动态规划就相当于合理枚举状态,是一种优美的暴力。 二、编程题1,2的递推方程 1 . dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + a[i][j]; 2 . dp[i] = max(0,max(dp[i-1] + a[i],a[i])); 三、结队编程情况 要提高自己的表达能力,更清晰地说出自己的想法,然后一起讨论。 来源: https://www.cnblogs.com/Remilia

动态规划

为君一笑 提交于 2019-12-03 04:09:20
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若⼲个⼦问题。但是经分解得到的⼦问题往往不是互相独⽴的 动态规划策略通常⽤于求解最优化问题。 – 在这类问题中,可能会有许多可⾏解。每⼀个解都对应于⼀个值,我们希望找到具有最优值的那个解,即最优解。 – 动态   • 在⼀定条件下,当前阶段的状态和下⼀阶段的状态之间的转移。 – 规划   • 建⽴状态转移⽅程(或称各阶段间的递推关系式),将各个阶段的状态以表格式⽅法存储。   • 表格式⽅法:⽤⼀个表来记录所有已解决的⼦问题的解 过程: • 阶段 stage   – 将所给问题的过程,按时间或空间特征分解成若⼲相互联系的阶段,以便按次序去求每阶段的解。 • 状态 state   – 各阶段开始时的客观条件叫做状态。 • 决策 decision   – 当各阶段的状态确定以后,就可以做出不同的决定,从⽽确定下⼀阶段的状态,这种决定称为决策。 • 状态转移 transition   – 根据上⼀阶段的状态和决策来导出本阶段的状态。 在分治法求解时,有些问题被重复计算了许多次 如果能够保存已解决的⼦问题的答案,⽽在需要时再找出已求得的答案,就可以避免⼤量重复计算,从⽽得到多项式时间算法。 基本要素 • 最优⼦结构(optimal substructure)   – 原问题的最优解包含了⼦问题的最优解。   – 该性质使我们能够以

动态规划总结

ⅰ亾dé卋堺 提交于 2019-12-03 03:59:38
动态规划 本人对动态规划的理解:我认为动态规划其实就是搜索的一种,但更加优美,速度更高。递归的方式就是老师说的备忘录,其实就是记忆化深搜,但本质上就是通过状态转移进行递推,所以能通过迭代的方式求解,当前问题的最优解依赖于子问题的最优解,于是当最小子问题初始化出答案后就可以一步一步往当前问题递推。妙啊妙啊。 作业题目的状态转移方程: 1 dp[i] = max(dp[j]+1, dp[i]); 2 if(dp[i][k]+dp[k][j]<dp[i][j]) dp[i][j]=dp[i][k]+dp[k][j]; 结伴编程   在结伴编程中,我和我的队友在课余时间一起做题,自己动手敲了一遍矩阵连乘,对动态规划算法有了更深的理解,希望我和我的队友能继续成长,继续进步! 来源: https://www.cnblogs.com/qq2210446939/p/11776014.html

Leetcode代码复盘_动态规划

♀尐吖头ヾ 提交于 2019-12-03 03:59:00
动态规划中包含3个重要的概念: 1.最优子结构 2.边界 3.状态转移公式 以跳台阶为例,最优子结构为f(10)=f(9) + f(8),边界是f(1)=1, f(2)=2,状态转移公式f(n)=f(n-1) + f(n-2) 最长回文子串 方法三:动态规划 为了改进暴力法,我们首先观察如何避免在验证回文时进行不必要的重复计算。考虑“ababa” 这个示例。如果我们已经知道“bab” 是回文,那么很明显,“ababa” 一定是回文,因为它的左首字母和右尾字母是相同的。 C++的动态规划写法: class Solution { public: string longestPalindrome(string str) { const int n = str.size(); if(n < 2) return str; int s = 0, e = 0; int dp[n] = {0, }; for(int j = 0; j < n; ++j){ for(int i = 0; i < j; ++i){ if(!(dp[i] = dp[i + 1] || str[i] != str[j]) && (e - s) <= (j - i)) s = i, e = j; } } return str.substr(s, e - s + 1); } }; 令dp[j][i]从字符串j到i是否为回文串

递归与动态规划---汉诺塔问题

眉间皱痕 提交于 2019-12-03 03:19:51
【问题】   给定一个整数n,代表汉诺塔游戏中从小到大放置的n个圆盘,假设开始时所有的圆盘都放在左边的柱子上,想按照汉诺塔游戏的要求把所有的圆盘都移到右边的柱子上,实现函数打印最优移动轨迹。 【举例】   n = 2时,打印:   move from left to mid   move from left to right   move from mid to right 【基本思路】 假设有left柱子,mid柱子和right柱子,都在left柱子的圆盘1~i完全移动到right,最优的过程为: 将圆盘1~i-1从left移动到mid 将圆盘i从left移动到right 将圆盘1~i-1从mid移动到right 如果盘子只有一个,直接从left移动到right即可 下面是使用python3.5实现的代码 #汉诺塔问题 def hanoi (n) : def func (n, left, mid, right) : if n == 1 : print( "move from " + left + " to " + right) else : func(n- 1 , left, right, mid) func( 1 , left, mid, right) func(n- 1 , mid, left, right) if n < 1 : return return func(n,

C++动态规划实现查找最长公共子序列

拜拜、爱过 提交于 2019-12-03 02:26:12
具体内容之后再补_(:з」∠)_先贴代码 1 #include<cstdio> 2 #include<cstring> 3 #include<stack> 4 #include<ctime> 5 #include<iostream> 6 #include<fstream> 7 #include<algorithm> 8 #include<windows.h> 9 using namespace std; 10 LARGE_INTEGER nFreq;//LARGE_INTEGER在64位系统中是LONGLONG,在32位系统中是高低两个32位的LONG,在windows.h中通过预编译宏作定义 11 LARGE_INTEGER nBeginTime;//记录开始时的计数器的值 12 LARGE_INTEGER nEndTime;//记录停止时的计数器的值 13 #define N 10000 14 //const int SIZE_CHAR = 10000; //生成32 + 1位C Style字符串 15 const char CCH[] = "_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; 16 int dp[N][N]; 17 char c; 18 int main(void) 19 {