算法第3章上机实验报告

算法第3章上机实践报告

实践报告任选一题进行分析。内容包括:

1.实践题目

7-1数字三角形

2.问题描述

给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

3.算法描述

我的思路:题意为从三角形顶到底的最大路径,解决问题的时候从底部入手,相邻的两层数字依次进行合并。较低层与其上一层运算时,依次将较低层的相邻两个数比较取最大值来与其上一层的数字进行合并计算。

首先将数字三角形存储在一个二维数组a[n][n]中,

然后先对数字三角形的最底层进行比较:

   for(int i=n;i>0;i--)

   for(int j=1;j<=i;j++){

if((a[i][j]+a[i-1][j])>(a[i][j+1]+a[i-1][j]))

{

a[i-1][j]=a[i][j]+a[i-1][j];

}

else a[i-1][j]=a[i][j+1]+a[i-1][j];

   }

最后再输出最高位a[1 ][1 ]:cout<<a[1][1];

4.算法时间及空间复杂度分析(要有分析过程)

时间复杂度:因为两个for语句叠在一起,所以时间复杂度为O(n^2)

空间复杂度:该算法直接在原数组a[n][n]上操作的,所以空间复杂度为O(1)。

5.心得体会(对本次实践收获及疑惑进行总结)

刚开始我是用自己对动态分析的理解用Max(i,j)表示代表从第 r 行的第 j 个数字到底边的最佳路径的数字之和,可是递推公式不是很好写,在老师讲解之后才写出来递归公式:Max ( r, j) = Max{ Max (r+1,j), Max (r+1,j+1) } + a(r,j).在此写出还没有写出递归公式之前,我用的是以上分析的两个循环,自下而上,先判断下一层左边a[i][j]和右边a[i][j+1]与上一层相邻数字a[i-1][j]相加的大小,比较之后大直接再次赋值给a[i-1][j],依次这样比较,最后最大的值将是a[1][1].由此输出a[1][1]即可。由此两种虽然神通型不同的方法。我觉得动态规划最难点还是写出递归方程式,我出现的情况就是,虽然能够想的到,但是不太能够写的出来,只会用简单的循环。由此我觉得动态规划这一块还是得多练题,多接触不同的题型,才能活跃自己的思维,能够想出解决的办法。

猜你喜欢

转载自www.cnblogs.com/zmzmkkk-/p/9942327.html