算法第3章上机实践报告

1、实践题目

  数字三角形

2、问题描述

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

QQ截图20170929023616.jpg

3、算法描述

文字描述:新建一个二维数组b,用来记录当前数的上一层累加的最大值。由于每一步只能左下或者右下,所以每一行第一个元素和最后一个元素只能选择右上角和左上角的值,所以递推式分为三种情况:①(j=1)b[i][j]=a[i][j]+b[i-1][j]; ; ② (j= i ) b[i][j]=a[i][j]+b[i-1][j-1];;③、(j>1 && j<i) b[i][j] = a[i][j]+ max(b[i-1][j-1],b[i-1][j]);

代码:d

for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
{
if(j==1)
b[i][j]=a[i][j]+b[i-1][j];
else if(j==i)
b[i][j]=a[i][j]+b[i-1][j-1];
else if(j>1 && j<i)
b[i][j] = a[i][j]+ max(b[i-1][j-1],b[i-1][j]);


}

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

新建了一个辅助变量二维数组b,所以空间复杂度为O(n*n)。利用两个for循环遍历数字三角形计算最大值,所以时间复杂度为O(n*n)。

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

第三章主要学习的是动态规划。而动态规划最重要的是把原问题分解成多个子问题并得出递推式,就好像数学题目里面找规律的题目一样,但大部分子问题的最优解都由其他子问题的最优解推导得到,所以一般需要辅助空间来记录已计算出来的子问题最优解,由自底向上的方法慢慢推出原问题的最优解。但如何找到这个正确的递推式是十分关键的一步。在做题过程中思考如何推出这个递推式是一个比较困难的过程,有想过通过画表帮助推导。在实践题第三题就比较头疼了,缺乏头绪,最后上网查看别人的讲解才终于搞懂。

猜你喜欢

转载自www.cnblogs.com/xixizhang/p/9893372.html