算法第三章作业

组员:高珞洋,何汶珊

你对动态规划算法的理解

首先,个人感觉动态规划是在分治法的基础上进行了改良,但是动态规划和分治法的使用是需要分情况的,并非适用分治法的问题都能用动态规划

分治法的思想可以粗略概括为:

1.将问题分解成若干个规模较小的子问题,各个子问题之间没有关联

2.将每个小规模的问题逐个解决

3.合并子问题

然后动态规划与分治法不同的点在于:

1.虽然都是分割成规模较小的子问题,但是各个问题之间有联系

2.动态规划需要一个表,来表达各个问题之间的关系,同时存储子问题联系合并之后的数据

动态规划的难点在于,理解并且运用好这张表:

首先需要弄清楚这张表代表了什么,一般而言辅助表的作用是存储本级问题的最优解,同时本级问题的最优解要包含较低级问题的最优解

其次要写好递归方程式,即用递归方程是表达各级问题最优解之间的关系,以及如何根据下一级最优解和已有条件获得本级的最优解

//以下一个问题摘自珞洋博客

有了递推关系式,为什么不用递归呢?

事实上,有了递推关系后,利用递归是完全能解决问题的,但是它和动态规划相比时间却大大增加,原因就在于递归进行了太多次重复运算。
递归解题的时候,假设我解第n个问题,需要从n-1,n-2...一直解到第1个问题,再将所有结果相加得到第n个问题的解。而这些步骤显然在解第n-1个问题的时候都做过一遍,增加了许多无用开销。

在动态规划中,我们用数组保存最优解,即保存了n-1的最优解,那么当求解第n个问题的时候,直接调用n-1的最优解即可,大大降低了时间复杂度。这也是我们追求利用循环实现递推关系而不用递归的原因。

分别列出编程题1、2的递归方程

3-1单调递增最长子序列

定义ele[i]表示第i个元素,maxSub[i]表示第一个元素到第ele[i]的最长单调递增子序列的长度
从前开始往后扫描,将每个元素作为最后一个元素,求此情况下的最长单调递增子序列的长度,并以此作为一个子问题,即每个maxSub[i]为一个子问题。
在每个子问题中我们仍需要进行扫描,从第一个元素扫到第i-1个数,设扫描的数为j,即0<j<i。

那么我们要做的就是,如果ele[j]<ele[i],那么理应让当前的递增子序列长度+1。但是直接+1忽略了两次的ele[j]之间可能出现降序的情况,因此需要比较两次的maxSub[j]+1,因为maxSub[j]表示第一个元素到第ele[i]的最长单调递增子序列的长度,而当ele[j]<ele[i],那么ele[i]必然能加入其中构成新的递增子序列且长度加一,即maxSub[i]=maxSub[j]+1

由此得出递归方程:

maxSub[i] = max{maxSub[j] + 1}    (0<j<i,0<i<n)

在代码实现中,需要额外变量来保存max{maxSub[j] + 1},不过为了图方便,我直接把maxSub[j] + 1放到maxSub[i]中。这样在求解maxSub[i]的时候,maxSub[i]当前的值就表示上一个maxSub[j] + 1,这样就只用比较maxSub[j] + 1maxSub[i]了,即:

maxSub[i] = max{maxSub[i], maxSub[j] + 1}    (0<j<i,0<i<n)

3-2 租用游艇问题

定义cost[i][j]表示第i个租船点到第j个租船点的费用,min[i]表示从第i个租船点到终点的最小费用
这题一开始采用的算法,需要用到一个二维数组来存储每个租船点到终点的最小费用,但在参考了一些资料之后,发现可以采用更加简洁易懂的算法:
假设第i个租船点到终点的最低费用路径为i-A-B-C-D-n(终点),那么从第A个租船点到终点的最低费用路径肯定是A-B-C-D-n(终点),依此类推,因此可以从终点往前推,即表min[i]从右往前填表

因此表min[i]要内存储的数据为第i个租船点到终点的最低费用,则令min[i]=cost[i][i+1]+min[i+1],若cost[i][i+2]+min[i+2]<min[i],则令min[i]=cost[i][i+2]+min[i+2],反之相反,因此可得递归方程为

min[i]=min{cost[i][j]+m[j],m[i]},i+1<=j<=n

说明结对编程情况

在结对编程中,基本上是珞洋来打代码,我用草稿纸跟着他的思路写一下递归方程或者画一下过程

在比较难的地方,比如表的作用,下一级的最优解和上一级的最优解之间的关系,都是珞洋跟我讲解的

珞洋的讲解总是很详细,会让我在思路上有很深刻的印象,但是这样我也会缺乏锻炼的机会,导致真正上机自己打代码时会有很多bug,实操能力不强

因为上周有想着要自己多实操,所以在pta顺着自己的思路打了两题,然后再对比珞洋的代码,就会发现自己的可读性不强,然后也不够简洁明了,格式也不是那么好看

希望后面除了学习珞洋的思路,还能在实操上多学习

posted @ 2019-11-03 22:17  有只泉仔  阅读(129)  评论(0编辑  收藏  举报