算法第三章作业
算法第三章作业
对动态规划的理解
可以采用动态规划算法进行解决的一个重要性质即是该问题必须具备最优子结构性质,所谓的最优子结构性质,简单来说就是指原问题的最优解必然包含了原问题的子问题的一个最优解。我对动态规划的理解其实主要是以下四点:
(1) 将整个计算过程转化为多阶段的决策过程。
(2) 问题的最优解是由这个问题的多个子问题的最优解组合而成。
(3) 动态规划的每一步的决策是需要前面的局部最优决策作为基础来做决定,相互之间存在依赖原则,具有最优子结构的性质,最优子结构性质:最优解的任何子问题是 相对于子问题的起点到终点仍是的该子问题的最优解。
(4) 动态规划可以由递归和迭代相结合实现。
其中第三点的主要适用情况:最长公共子序列,和N个起点到N个终点,中间有无数个中间结点 F(n) = [ max| min ] (F(n-1),T(n-1))。动态规划法解决算法问题的实质是自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解),动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。但动态规划的缺点在于:没有统一的标准模型,在解决多维问题的时候容易会出现维数问题。
分别列出编程题1、2的递归方程
(1) 单调递增最长子序列
假设L是字符串长度,i是字符串下标,f(i)代表当前以S[i]为首字母的字符串最大长度, 递归方程:f(i)=max(f(i+1),f(i+2),...,f(L-1),f(L))+1;f(i)的最大值即为所求。
Ps: 在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列。
(2) 租用游艇问题
fin[i][j] = fin[i][k] + r[k][j]; (i<=k<=j);
先从r = 2开始迭代,r表示问题规模,当问题规模增加到n是,便可求出最优解,最后打印输出fin[1][n]。
Ps:fin[i][j]代表从第i个站出发到第j站所用的最少租金。
结对编程情况
截止到目前为止,我和队友其实在结对编程的过程中其实分工还是很明确的,在结对编程的过程中我主要负责问题分析,根据时间复杂度要求选择采用哪种算法思路,然后对问题情况进行分析讨论,写出递归方程。而队友因为是编程代码比我规范,所以由队友来进行代码实现,而在这个过程中我也会在旁辅助队友,检查代码是否有书写的语法错误,以减少后期因为细微的语法错误而进行代码调试的时间。在已经过去的大半个学期的结对编程过程中,我们的配合还是很好的,而自己也是从一开始算法设计不理想,到慢慢可以在跟队友的讨论中寻找最优解决方法,同时自己也是在这个过程中学习到了如何更规范地编程以及代码的书写。现在我和队友的结对编程也不再仅仅局限于算法的实践课堂,而是在课下,比如课后作业,甚至在Java编程的过程中都会进行结对编程,很好地提高了编程的效率,也磨合了两个人在编程方面的配合。