第三章动态规划实验报告

《动态规划实验报告》 计科2001 陈梓聪 20201003024

       动态规划的使用:通过第三章学习了动态规划,我们了解到:在原问题最优解依赖于子问题的最优解,且子问题存在重叠子问题的时候,我们用动态规划的思想去考虑这个问题。

       动态规划的分析过程:首先,动态归划分析问题的过程分为四步:1.分析原问题的子结构特点 2.列出递推式(转移方程)3.给定初始化和边界条件 4.自底向上计算问题(填表)

       在这个实验报告中,我将以本次实验的7-3题为例子,谈一下我对动态规划的浅薄理解。

题目如下:

 

一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

输入格式:

第一行是一个整数,表示正方形的宽度N (1≤N<100);

后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。

输出格式:

至少需要的费用。

 

分析问题依赖关系:我们知道,要走到右下角,只能从它的左边或者上面走过来。所以对于最低通行费,我们可以知道,最终的最低通行费依赖它左边和它上面的最低通行费,它的左边同样依赖左边的左边和左边的上面。这样我们就可以发现依赖关系。

       建立递推式:我们先建立一个二维数组,称为money,原数组称为a,代表着从起点到该点的最低通行费。我们就可以用money表示递推式:。

       分析边界条件:我们再来分析一下边界条件,因为要走到a[0, j]或者a[i,0],(1<=i<=N, 1<=j<=N)都是直接从起点开始走,中途不经过拐弯得到的最低费用。所以我们可以开始初始化表格:

money

0

1

2

3

4

5

1

1

5

11

19

29

2

3

 

 

 

 

3

9

 

 

 

 

4

19

 

 

 

 

5

39

 

 

 

 

 

       填表:开始填表,填表格的代码如下:

       for(int i =2;i<=n;i++)

  for(int j=2;j<=n;j++){

              money[i][j] = min(money[i-1][j],money[i][j-1])+a[i][j];

       }

       分析时间、空间复杂度:本次问题解决之后,我们再分析时间复杂度。可以看到,我们关键填表格的代码是用的n*n的时间,就证明我们的时间复杂度是O(n*n)级别的。而我们创建了一个money数组和a数组,用n*n的额外空间,所以我们的空间复杂度为O(n*n)。

       心得与体会:动态规划这类型的题目,模型较多,依赖关系有的时候比较复杂,所以我们在分析这类问题的时候,要先将原问题和子问题的依赖关系分析好,再去进行接下来的步骤。在写题目的过程中,我们也要把要分析的问题的初始化做好,如果初始化没做或者步骤出错,可能对整个结果造成的影响是灾难性的。这类题目如果暂时想不到,可以尝试一下自己手画表格填一下表,可能会有意外的收获。

 

posted @ 2021-10-26 22:17  老八小汉堡  阅读(77)  评论(0编辑  收藏  举报