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

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.心得体会(对本次实践收获及疑惑进行总结)
动态规划的主要难点在于找到最优解的性质,并刻画其结构特征,刚开始需要借助草稿来理清思路,不过后来发现遇到的问题书上都给出了例题,用所提到最大公共子序列、最大字段和或背包问题等等就能解决大部分问题。刚开始的疑惑在于“动态”规划是如何动起来的,其实就是在于在计算时不是单一的判断,而是需要记录结果并多次比较得出最优解。
浙公网安备 33010602011771号