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 ]给推导出

来。最后我们成功地做出了这道编程题。