动态规划

动态规划

僤鯓⒐⒋嵵緔 提交于 2019-12-03 09:45:21
一、动态规划   动态规划的实质是分治法和解决冗余。所以,动态规划就是将原问题分解成规模更小的子问题,且原问题的最优解与子问题的最优解相关。动态规划将问题实例分解为更小的/相似的子问题,并存储子问题的解,使得每个子问题只求解一次,最终获得原问题的答案,以解决最优化问题。 二、编程   1、单调递增最长子序列 for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ if(a[i]>a[j]){ longesta[i]=max(longesta[i],longesta[j]+1); } } }   2、租用游艇问题 for(int i=2;i<=n;i++){ for(int j=i+1;j<=n;j++){ int k=j-i; for(int p=k;p<j;p++){ if(a[k][j]>a[k][p]+a[p][j]) a[k][j]=a[k][p]+a[p][j]; } } } 三、结对编程汇报   对动态规划的理解不到位,虽说能够解决问题,但是时间复杂度处理不够,总是出现runtimeerror问题,两人的交流不够。 来源: https://www.cnblogs.com/cmh2969/p/11785989.html

算法第三章作业

狂风中的少年 提交于 2019-12-03 09:42:18
1.你对动态规划算法的理解。 动态规划算法可以算是分治法的优化版,其思想也是将原问题分解成若干个非独立的子问题,先得子问题的解再得原问题的解。动态规划算法适用于解最优化问题,首先找出最优解性质,递归地定义最优值,再自底向上的方式计算出最优值,最后根据最优值时得到的信息构造最优解。 2.分别列出编程题1、2的递归方程。 (1)m [ i ] = m a x { m [ k ] | a [ k ] < a [ i ] } 1 < = k < i (2)m [ i ] = m i n { c [ i ] [ k ] + m [ k ] } 3.说明结对编程的情况。 结对编程进行得比较顺利,互相学习共同进步,也多了一个可以监督自己学习的对象。 来源: https://www.cnblogs.com/chengyi1102/p/11785911.html

算法第三章作业

浪子不回头ぞ 提交于 2019-12-03 09:38:59
1. 你对动态规划算法的理解 动态规划算法与分治法类似,其基本思想是将待求解问题分解为若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解。适合用动态规划法求解的问题分解得到的子问题不是独立的,数目常常是多项式量级,用一个表把所以已解决的子问题的答案记录下来,可以避免大量的重复计算。动态规划算法常常用于解决求最优解的问题。 2. 分别列出编程题1、 2 的递归方程 编程题1: a[i][j]=min{ a[i-1][j-1], a[i-1][j] } 1<i<=n,1<=j<=i; 编程题2: a[i] = max{ a[i-1]+a[i], a[i] } 1<=i<=n; 3. 说明结对编程情况 遇到问题可以及时提出,共同解决,解除疑惑。 可以学习对方的解题思路,共同进步。 通过检阅对方的代码,可以增强自己读代码能力和找到错误代码的能力,同时对方会指出错误,提高编程效率。 来源: https://www.cnblogs.com/haowen233/p/11785836.html

算法第三章作业

断了今生、忘了曾经 提交于 2019-12-03 09:35:12
1.对动态规划算法的理解 动态规划算法和前一章讲到的分治法类似,都是解决若干个同类子问题的方法,不同点是分治法会将这些子问题重复计算,而动态规划法则是用了备忘录把已经计算过的子问题记录下来,再次用到时只需要查表即可,后者大大节省了运算的时间。 2.列出两题的递归方程 (1)f[i]=max(f[j]+1,f[i]) (0<j<i) f[i]表示以第i个数字结尾的序列的长度 (2) a[i][j] = min(a[i][k] ,a[i][k] + a[k][j] )(i<=k<j) a[i][j]表示从i到j的最低费用 3.结对编程情况 实验完成情况还算良好,还需要提高思维能力和动手能力。 来源: https://www.cnblogs.com/wuzixi1807/p/11785603.html

《算法设计与分析》-- 第三章作业

我是研究僧i 提交于 2019-12-03 09:34:30
一、对动态规划算法的理解   动态规划算法与分治法类似,都是将求解问题分解成若干子问题,解决子问题,最后结合子问题得到原问题的解。但与分治法不同的是,这些分解的子问题往往不是互相独立的,其内部存在某种联系,所以可以将子问题的解记录在一个表上,最后通过读表的方式解决原问题。动态规划适用于解最优化问题。 二、分别列出编程题1、2的递归方程   1.单调递增最长子序列:用一个数组a【】来存数列,用dp【i】来表示以i下标结尾的数的最长子序列,则   当(1 <= j < i且a【i】 > a【j】 )    dp[i] = max(dp[i], dp[j] + 1)    2.租用游艇问题:用一个二维数组a【】【】来存各出租站之间的租金,用dp【i】【j】表示第i站到第j站的最小费用,则    当(2 <= i < j <= n)   dp[1][j] = min(dp[1][j] ,dp[1][i] + dp[i][j] ) 三、结对编程情况    跟着队友,特别是基础好的队友学习编程,效率确实大大的提高了很多,而且很多小问题也在队友面前解决了。但是我们之间的实力悬殊过大,总会让我有点懈怠,让我觉得反正有他在,我随随便便做一些就ok,总是不求甚解。感觉自己没有硬实力,所以以后我要自己独立完成一些题目,尽量是自己解决,然后实在不会的地方在问自己的伙伴。这样既能提升自己又能少麻烦一下同伴

算法第三章作业

让人想犯罪 __ 提交于 2019-12-03 09:33:45
1. 你对动态规划算法的理解 动态规划算法类似于分治法,将原问题分解为多个子问题求最优解。但动态规划算法更加高效。在分析问题时要能够准确找出问题的子结构以及通过子结构重新构造最优解。 2. 分别列出编程题1、2的递归方程 1. b[i]=max{ b[j]+1, b[i] } (j<i) 2. b[i][j]=min{ b[i][j], ( b[i][k]+b[k][j] ) } (i<k<j) 3. 说明结对编程情况 情况挺好的。队友教会我很多,帮助我梳理思路解决问题。两个人还能够锻炼协作的能力,相互督促更好进步。 来源: https://www.cnblogs.com/yehaolin/p/11785583.html

第三章作业

巧了我就是萌 提交于 2019-12-03 09:33:09
第三章作业 一. 你对动态规划的理解 我对动态规划印象最深刻的就是备忘录法,几乎每一次都是在填表,先找出每一个子问题的递归方程,再是依次进行填表,动态规划和备忘录很类似,动态规划是自下向上解决问题的,而备忘录是自上向下解决问题的,但是基本都是一个数组进行填表对问题进行解决。 二. 分别列出编程题 1、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到终点的最小费用 三.结对编程 通过结对编程,发现相互编程一些 bug并且解决问题 来源: https://www.cnblogs.com/1149640304penny/p/11785578.html

算法第三章作业

情到浓时终转凉″ 提交于 2019-12-03 09:27:58
对动态规划算法的理解 动态规划算法和分治法有相似之处,解题过程中,都会把总问题划分成一个个子问题,也都具有重叠子问题的性质。不同之处在于,动态规划算法的各个子问题并非相互独立的,下一个子阶段的解是建立在上一个子阶段的求解的基础上。所以在使用动态规划算法求解问题的过程中常常要用到一个储存上一阶段解的数组。 动态规划算法的解题步骤一般分为4步:划分、确定状态和状态变量、写出递推方程以及确定边界条件。 编程题1、2的递归方程 1 m[i] = max{ a[i], a[i] + m[i - 1] } 2 m[i] = min{ c[i][k] + m[k] } 说明结对编程情况 最近没有进行太多结对编程,但有一起讨论过算法思想,复习重要题型。 来源: https://www.cnblogs.com/vanora-/p/11785419.html

算法第三章作业

泄露秘密 提交于 2019-12-03 09:26:59
1.对动态规划的理解 我认为动态规划其实有一点像分治法,他们的相似之处都是将一个问题分解为若干个子问题,但不同的是,动态规划的若干个子问题往往是有联系的,如果用分治法会将这些子问题重复计算若干次,所以动态规划可以采用备忘录方法,将已经计算过的子问题的解存在一维或二维数组中,优化计算。 2. 列出编程题1、2的递归方程 1 . b[j]=max(b[i]+1,b[j]) (0<=i< j) 2.dp[1][j] = min(dp[1][j] ,dp[1][i] + dp[i][j] )(2<=i<j<=n) 3. 说明结对编程情况 结对编程能很好的结合两个人的想法,有效提高解题的效率,也能学习到更多。 来源: https://www.cnblogs.com/zttt/p/11785392.html

步步为营,动态规划,深入浅出,思维提升

二次信任 提交于 2019-12-03 09:25:11
步步为营,动态规划,深入浅出,思维提升 ——算法第三章总结 软三 杨伟耿 20181003083 一、 步步为营,动态规划 动态规划算法与分治法类似,类比成上一章总结时举的例子,可以很容易理解其中的思想。但是,分治法应用在某些问题上时,会出现重复计算导致时间复杂度高的问题。以我的理解就是,动态规划像是填写一张表格,先把最底层的需要先知道的填了,然后后面的可以根据先前的填写,填写过程中都取最优的选择。 分治法是将问题分成几个独立的部分,最后再结合;动态规划就像上面所说的那样,有一个记录和保持的作用,几个部分互相联系。 动态规划的设计步骤:找出最优解的性质,并刻画其结构特征、递归地定义最优值、以自底向上的方式计算最优值、根据计算最优值时得到的信息,构造最优解。 编程题1(最长递增子序列)的递归方程如下: 定义m[i]为以第i个数结尾的最优解(单调递增最长子序列)用一维的表来填写这道题每一步的最优解结果: m[i] = max { m[k] + 1 | a[k] < a[i] } (1≤k≤i) 编程题2(租用游艇)的递归方程如下: 定义m[i]为第i站到最后一站的最优解(价格最便宜)用一维表来填写: m[i] = min { cost[i][k] + m[k] } (其中,cost[i][k]为第i站到第k站的价格) (i≤k≤n) 二、 结对编程,共同进步 最近结对编程效果不佳