算法第三章实验报告

1.7-3 最低通行费 (25 分)

1.1 问题描述

  (1)左上角进,右下角出

  (2)每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去——仅能向左或向下走

  (3)经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去——经过的和最小

1.2 算法描述

  在从起点到终点费用最小的最优路线中,起点到任何一点都是最优,具有最优子结构性质。因此利用了动态规划的算法。  

  利用二维数组存储数据和最优结果。

  针对一个方格,比较其左方格和上方格哪个费用小,就选择经过费用小的方格的路线到达指定方格。

  算法实现如下:

			if(dp[i-1][j] > dp[i][j-1])
			{
				dp[i][j] = m[i][j] + dp[i][j-1];
			} 
			else
			{
				dp[i][j] = m[i][j] + dp[i-1][j];
			}

1.3 问题求解:

1.3.1 根据最优子结构性质,列出递归方程式,

   递归方程式:dp[i][j] =dp[i][j]+min(m[i][j-1],m[i-1][j])

1.3.2 给出填表法中表的维度、填表范围和填表顺序。

  表的维度:二维

  填表范围:初始化第一行和第一列,填表第二列到第n列,第二行到第n行

  填表顺序:从上到下,从左到右

1.3.3 分析该算法的时间和空间复杂度

  时间复杂度:使用了两重循环,从上到下、从左到右进行填表,因此为O(n^2)

  空间复杂度:使用了两个二维数组储存各方的费用和到各方格动态更新的费用结果,因此为O(n^2)

1.3 心得体会

  本次实验我们组打了两题,本计划在课堂最后举手回答,但由于暂停讲题的变故,最终未能向老师讲解。

  收获:对动态规划的应用更熟练了。

  疑惑:列出的递归方程式不太准确,特别是无法很好地表述问题一的式子。

2. 你对动态规划算法的理解和体会

  动态规划性质:

   (1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

     (2)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。

  动态规划可解决一下问题:

    0-1背包问题、最大子数组问题、最长公共子序列、最长公共子串、编辑距离、钢条切割、矩阵链乘法、海量共享出行问题

  动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

  动态规划过程:

     (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

     (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

       (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

       (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

  

  

posted @ 2021-10-24 19:37  vivi耶嘿  阅读(64)  评论(0编辑  收藏  举报