动态规划

算法第三章作业

对着背影说爱祢 提交于 2019-12-03 09:20:32
1. 你对动态规划算法的理解(2分) 动态规划是把待求解的问题分解成若干个子问题,每个子问题求解一次,用一个表记录每个子问题的解然后从子问题的解中找到原问题的解。 解题思路是:(1)找出最优解的性质,刻画其结构特征;(2)递归地定义最优值;(3)以自底向上的方式计算最优值;(4)根据计算最优值时得到的信息计算最优解。 2. 分别列出编程题1、2的递归方程(2分) (1)m[i] = max(m[j]+1, m[i]); (2)m[1][n]=min{m[1][n], m[1][k]+m[k][n]} 3. 说明结对编程情况(1分) 队友把题编了一遍,我们互相交流解题思路,遇到问题互相指出,自己又独立编了一遍,加深了对动态规划算法思想的理解。 来源: https://www.cnblogs.com/xuewenblog/p/11785249.html

算法第三章作业

风格不统一 提交于 2019-12-03 09:16:12
一、对动态规划算法的理解   动态规划算法与分治法类似,都是将求解问题分解成若干子问题,解决子问题,最后结合子问题得到原问题的解。但与分治法不同的是,这些分解的子问题往往不是互相独立的,其内部存在某种联系,所以可以将子问题的解记录在一个表上,最后通过读表的方式解决原问题。动态规划适用于解最优化问题。 二、分别列出编程题1、2的递归方程   1.单调递增最长子序列:用一个数组a【】来存数列,用dp【i】来表示以i下标结尾的数的最长子序列,则dp【i】=max(dp【j】)+1(1<=j<i且a【i】>a【j】 )    2.租用游艇问题:用一个二维数组a【】【】来存各出租站之间的租金,用dp【i】【j】表示第i站到第j站的最小费用,则dp【i】【j】=min(dp【j】【k】)+a【i】【k】( i<k<=j) 三、结对编程情况    跟着队友,特别是基础好的队友学习编程,效率确实大大的提高了很多,而且很多小问题也在大佬面前解决了。但是我们之间的实力悬殊过大,总会让我有点懈怠,让我觉得反正有他在,我划划水就可以了。这一点特别不好,我还是要端正自己的态度,努力学习,不能只是靠着抱大腿来完成任务,别人的东西可能只是暂时属于你,但自己的东西却永远的属于你。 来源: https://www.cnblogs.com/hxyawsl/p/11785180.html

算法第三章作业

天涯浪子 提交于 2019-12-03 08:18:17
1. 你对动态规划算法的理解 动态规划的实质是分治思想和解决冗余,他与贪心和分治法类似,它们都将问题分为更小的类似的子问题。但贪心算法可能不能得到全局最优解,动态规划可以处理不具有贪心实质的问题。 2. 分别列出编程题1、2的递归方程 (1. f[i] = max{ f[k] | a[k] < a[i] } (1<=k<i) (2. f[i] = min{ f[k] + a[i][k] } (i<k<=j) 3. 说明结对编程情况 我和队友会先自己思索一段时间,其中一人敲另一个看,其间会有相互提问交流。 来源: https://www.cnblogs.com/qq2766022474/p/11784756.html

算法第三章作业

二次信任 提交于 2019-12-03 08:16:46
1. 你对动态规划算法的理解(2分) 动态规划就是将一个大问题划分为若干个小问题,先求解子问题,然后从这些子问题的解得到原问题的解。 用表记录已解的子问题的答案,避免重复计算提高算法效率。 2. 分别列出编程题1、2的递归方程(2分) 3-1 m[i] = max{m[k] | a[k]<a[i]} (1<=k<i) 3-2 m[i] = min{m[k]+a[i][k]} (i<k<=j) 3. 说明结对编程情况(1分) 先独立思考问题思路,再一起讨论得出动态规划方程。 提高编写代码速率,更深入思考问题。 来源: https://www.cnblogs.com/qq1065928103/p/11784715.html

第三章作业与学习总结

不羁的心 提交于 2019-12-03 08:14:19
引论:动态规划思想与分治法思想有点类似,都是将原本的大问题划分成一系列的小问题,但其实两者的区别还是相当大的。本文重点分享我对动态规划思想的理解与运用。 一、对动态规划算法的理解   首先,动态规划算法非常适合解决求最优解的问题,通过动态规划的思想,我们能够将一个问题的最优解推至其子问题的最优解,就像商人过路问题一样,商人到达终点所需要的过路费取决于他上一步花费的过路费,而他上一步花费的过路费有可以追溯到更早之前的情况。虽然动态规划的思想容易让人接受,但掌握动态规划算法设计的方法才是重中之重——一般分为四步:1.根据实际情况找出最优解的性质。 2.根据最优解性质推导出递归方程(这一步尤为重要)。 3.分析递归方程,设计合适编程语句。 4.通过填表法记录所有最优解情况,并找到题目所需的最优解。   当我们使用动态规划算法的时候,不要因为省事而节省了写出递归方程式的步骤,往往正是这一步能够帮助我们更好地理解问题,分析解题策略。而动态规划又常常到重叠子问题,因此我们常用填表法的方法,来存放每一种情况的最优解,最后得出总问题的最优解。   个人认为,利用动态规划算法解决问题要着手于解决三个“怎么样”:第一,怎么样得出当前问题的最优子结构? 第二,怎样通过最优子结构写出递归方程式? 第三, 怎样通过递归方程式来编程以完成填表? 二、列出编程题的递归方程式 第一题: 求最长的递增子序列

算法第三章作业

孤人 提交于 2019-12-03 07:57:00
1. 动态规划是一种能够减少重复运算的一种算法,比较适合原问题能依赖于子问题解得,而子问题也能够依赖于子子问题解得而出的问题。 其次,动态规划更适合于数据量较多的时候的一种算法,当数据量没有到达一定规模的时候,动态规划算法不能够体现出足够的优势。 (如对于背包问题的贪心算法和动态规划法) 2.(1)单调递增最长子序列: temp[ i ] = temp[ i-1 ] + 1 , ( arr[ i ] > arr[ i-1 ] )       = 1 , ( arr[ i ] <= arr[ i-1 ] )   (2)租用游艇问题:    arr[ i ][ j ] = min( arr[ i ][ j ], (arr[ i ][ k ] + arr[ k ][ j ]) );    因为游艇从起点1到达终点n的过程中,并不是每一个点都需要经过,所以,需要利用循环来比较每一个中间点k的费用。 3.结对编程目前来讲比较好,能够促使两个人一起解决难题。 来源: https://www.cnblogs.com/yi2105/p/11783981.html

算法第三章作业

旧街凉风 提交于 2019-12-03 07:49:24
1.对动态规划算法的理解 1)动态规划算法是一种用于求解具有最优解性质问题的算法。2)与递归方法比,动态规划算法用来解决子问题被重复计算多次的情况且没有栈溢出的风险。3)递归方法、递归备忘录方法都是自顶向下的算法,而动态规划算法是自顶向下的迭代算法,避免了子问题的重复计算。4)动态规划通常可以把时间复杂度从指数级降到多项式级。5)动态规划算法是用空间代价换取时间代价的算法。 2. 编程题1、2的递归方程    3. 结对编程情况    本次结对编程将较多时间花在了讨论讨论动态规划的思想上,并没有在课堂上完全解决所有实践题目,仍需提高课堂解决问题的效率。与编程伙伴在讨论过程中分别对同一问题进行备忘录方法和和非递归动态规划算法的实操,明白了备忘录方法即使避免了子问题被重复计算,但其递归算法仍然有可能造成栈溢出,因此求解具有最优子结构性质且子问题重叠的问题,最好采用非递归的动态规划算法。 来源: https://www.cnblogs.com/gdufsczg/p/11783761.html

算法第三章作业

。_饼干妹妹 提交于 2019-12-03 07:35:06
一. 对动态规划的理解 动态规划通常用于求解具有某种最优性质的问题。在这类问题中,可能会出现许多可行解,每一个解对应于一个值,动态规划可以帮助我们找到具有最优值的解。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,可以用动态规划求解的问题,分解得到的子问题不是相互独立的,而分治法却会出现有些子问题被重复计算很多次的情况,动态规划可以避免大量的重复计算。 二. 递归方程 1. dp[i] = max(dp[j]+1, dp[i]) d[i] = 长度为i+1的递增子序列的长度 2. r(i,j) = min(r(i,k)+r(k,j)) (i<k<j) , r(i,i) = 0 三. 结对编程 在结对编程的过程中,可以找到解决一个问题的不同思路。解题时分工合作,也加快了解题的效率。 来源: https://www.cnblogs.com/lqa00/p/11783410.html

算法第三章作业

谁说胖子不能爱 提交于 2019-12-03 07:10:06
1.对动态规划算法的理解 动态规划与分治法相似,都是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中得到原问题的解。但是区别在于动态规划每个子问题并非独立,而是相互有联系。 动态规划可以用表格存储每个子问题的最优解,有需求时使用。 2.分别列出编程题1、2的递归方程 1.m[i]=max{m[i-1]+1|a[k]<a[i]} 1<=k<i 2.m[i]=min{c[i][k]+m[k]} i<k<=n 3. 说明结对编程情况 一同推理出递归方程,递归方程一推出就可以轻松解决问题。彼此交流学习经验。 来源: https://www.cnblogs.com/xiaozhao-/p/11782403.html

背包问题c++动态规划方式

懵懂的女人 提交于 2019-12-03 06:50:25
#include <iostream> using namespace std; int weight[5] = {5,2,4,8,6}; int len[5] = {2,4,3,1,7}; int num = 5; int space = 15; int main() { int max_weight[15] = {0}; for(uint32_t i=0; i<num;i++) { for(uint32_t j=space; j>len[i]; j--) { if (max_weight[j-len[i]] + weight[i] > max_weight[j]) { max_weight[j] = max_weight[j-len[i]] + weight[i]; } } for(uint32_t j=0; j<space; j++) { cout<<max_weight[j]<<" "; } cout<<endl; } cout<<max_weight[14]<<endl; return 0; }   结果 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 5 5 5 5 7 7 7 7 7 7 7 7 0 0 0 5 5 5 9 9 9 9 11 11 11 11 11 0 0 8 8 13 13 13 17 17 17 17 19 19 19 19