算法第三章实践
1. 实践题目
数字三角形
2. 问题描述
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
输入格式:
输入有n+1行:
第 1 行是数字三角形的行数 n,1<=n<=100。
接下来 n行是数字三角形各行中的数字。所有数字在0..99 之间。
输出格式:
输出最大路径的值。
输入样例:
在这里给出一组输入。例如:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
在这里给出相应的输出。例如:
30
3. 算法描述
定义一个新的数组a[120][120],从底层往上填数据,每一个直角三角形顶端都是其下面的三角形的最优解。
#include<iostream>
using namespace std;
int main()
{
int n, i, j;
int m[120][120], a[120][120];
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
m[n][i]=a[n][i];
for(i=n;i>1;i--)
{
for(j=1;j<=i;j++)
{
if(m[i][j]>=m[i][j+1])
m[i-1][j]=a[i-1][j]+m[i][j];
else
m[i-1][j]=a[i-1][j]+m[i][j+1];
}
}
cout<<m[1][1];
return 0;
}
4. 算法时间及空间复杂度分析
填表的时间复杂度为O(n^2);使用了二维数组,空间复杂度为O(n^2)。
5. 心得体会
从顶端到底端走的时候想不通该怎么走,但是从底端往上走就会比较容易想清楚,最重要的还是要想清楚解决此问题的算法是怎么样的。