第三章上机实践报告
1. 实践报告任选一题进行分析。内容包括:
1.1 问题描述
一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。
这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?
注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。
输入格式:
第一行是一个整数,表示正方形的宽度N (1≤N<100);
后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。
输出格式:
至少需要的费用。
输入样例:
5
1 4 6 8 10
2 5 7 15 17
6 8 9 18 20
10 11 12 19 21
20 23 25 29 33
结尾无空行
输出样例:
109
结尾无空行
样例中,最小值为109=1+2+5+7+9+12+19+21+33。
1.2 算法描述
从数组的第一个元素开始,在2N-1个单位时间内穿过去,每次穿越一个小方格就花费1各单位时间,也就是穿越的小方格要控制在2N-1内。而要穿过去,则一定需要从上到下,从左到右走,所以定义一个数组a[i][j],寻找从起到到该位置的最低费用,也就是求它累加值的最优解,将第一行从左到右填入后,将第一列从上往下填入,其余位置则比较其左边和上边两个数,哪个小取哪个,再累加。
1.3 问题求解:
1.1.1 根据最优子结构性质,列出递归方程式。
当i=1时,a[i][j]=a[i][j-1]+x
当j=1时,a[i][j]=a[i-1][j]+x
否则:a[i][j]=min(a[i][j-1],a[i-1][j])+x
1.1.2 给出填表法中表的维度、填表范围和填表顺序。
表的维度:二维
填表范围:除了第一行的元素和第一列的元素,其他元素的上一个元素所在位置都应该在该数的上面或左边。I从1到n,当i=1时,a[1][j]=a[1][j-1]+x;当j=1,a[i][1]=a[i-1][1].
填报顺序:第一行向右累加,第一列向下累加,其余位置按从左到右,从上到下的顺序解出最优解,一直到n。
1.1.3 分析该算法的时间和空间复杂度
时间复杂度:O(n^2)
空间复杂度:O(n^2)
1.3 心得体会(对本次实践收获及疑惑进行总结)
这道题目运用了动态规划中填表的方法,在填表过程中,首先要确定它的边界条件,正如它的第一行,第一列,所以在构造二维数组的时候,i和j的下标都应该从1开始,能减免后面不必要的麻烦。填表过程中也要先想清楚,是从左到右,还是从上到下,写出递归方程,思路会更加清晰。
2. 你对动态规划算法的理解和体会
动态规划就是通过把原问题分解为相对简单的子问题的方式解复杂问题的方法,其常常适用于重叠子问题和最优子结构性质的问题。我们第一步就是要注意边界条件,第二部寻找到对应的递归方程式,来辅助我们更好地做题。