算法第三章上机实践报告之数字三角形

1.实践题目

7-1 数字三角形 (30 分)
 

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

算法第三章上机实践报告之数字三角形_第1张图片

输入格式:

输入有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

2.问题描述
  思路:从数字三角的的倒数第二行(n-1)【2,7,4,4】行开始往上,取(n-1)行的下一行,即第n行【4,5,2,6,5】,将(n-1)行的第一个元素2与它的下一行第一个元素4以及下一行的第二个元素5分别相加取最大值,即max(2+4,2+5),将max存入n-1行的第一个元素,依次循环得到从n行到n-1行的值存在n-1行。n-行继续向上,最后顶端的数字即最长路径数。
3.算法描述
-----------------------------------------------------------------------------------------------------------------------------------
#include
using namespace std;
int res[1005][1005];
int a[1005][1005];
int main()
{
    int n,maxn=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
             cin >> a[i][j];
        }
    }
    for(int i=n-1;i>0;i--)
    {
        for(int j=1;j<=i;j++)
        {
            a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
        }
    }
    cout << a[1][1] << endl;
    return 0;
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.算法时间及空间复杂度分析
时间复杂度为O(n2),在动态规划的时候有两层for循环,且只有一条语句。空间复杂度为O(n2),创建了一个二维数组,每行每列均为n,故为O(n2).
4.心得体会(对本次实践收获及疑惑进行总结)
一开始数字三角形没有思路,等到有思路豁然开朗。对每一道题都应该细细想想,不要急着敲代码。

你可能感兴趣的:(算法第三章上机实践报告之数字三角形)