标签:公式 lse 复杂 题目 出错 复杂度 过程 最大 int
1、实践题目。
数字三角形
2、问题描述。
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的
顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
3、算法描述。
首先输入a[ n ][ n ].
再定义m[ n ][ n ].
然后先对数字三角的最底层进行赋值:
for(int i=0;i<n;i++)
{
m[n-1][i]=a[n-1][i];
}
再然后从倒数第二层开始向上,给出子问题的递推公式m[ i ][ j ] = max( m[ i + 1 ][ j ],m[ i + 1 ][ j + 1 ] ) + a[ i ][ j ]
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
if((m[i+1][j])>=(m[i+1][j+1]))
{
m[i][j]=a[i][j]+m[i+1][j];
}
else
{
m[i][j]=a[i][j]+m[i+1][j+1];
}
}
}
最后再输出最高位m[ 0 ][ 0 ]即可
cout<<m[0][0];
4、算法时间及空间复杂度分析。(要有分析过程)
时间:最大的使两个for语句叠在一起,所以时间复杂度为O(n^2)
空间:除了数组a[ n ][ n ]外还设置了一个m[ n ][ n ],所以空间复杂度为O(n^2)
5、心得体会。(收获、疑惑的总结)
刚开始自己凭借对动态分析的印象把m[ n ][ n ]的递推公式写出来了。但是紧接着自己就因为
不熟练从而不知道该从哪里开始第一次计算而使程序一直出错。然后在同伴的帮助下,我知
道了要从最小、最开始的问题开始计算、赋值,再用递推公式把最上面的m[ 0 ][ 0 ]给推导出
来。最后我们成功地做出了这道编程题。
标签:公式 lse 复杂 题目 出错 复杂度 过程 最大 int
原文地址:https://www.cnblogs.com/dingshupeng/p/9912253.html