算法第三章上机实践报告

1.实践题目:

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

QQ截图20170929023616.jpg

2.问题描述:

输入格式:

输入有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.算法描述:
#include<iostream>
using namespace std;
int n;
int a[100][100];
int num[100][100];
int MaxSum(int i,int j)
{
    if(num[i][j]!= -1)
    {
        return num[i][j];
    }
    if(i==n-1)  num[i][j]=a[i][j];
    else
    {
    int x=MaxSum(i+1,j);
    int y=MaxSum(i+1,j+1);
    num[i][j]=(x>=y?x:y)+a[i][j];
    }
    return num[i][j];
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<i+1;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
       for(int j=0;j<i+1;j++)
       {
        num[i][j] = -1;
       }
    }
 
    cout<<MaxSum(0,0);
     return 0;
}
4.算法时间及空间复杂度分析:

时间复杂度:

T(n)= n + (n-1) + (n-2) + … + 1 = n(n-1)/2 = n^2

在第n行,程执行n次将数据存入备忘录,(n-1)层每个数字经过一次比较,最后执行(n-1)次将数据存入备忘录,依次类推,得出最后时间复杂度为n^2。

空间复杂度:

程序需要用到的空间,是一个备忘录数组,数组大小为n * n,即空间复杂度O(n)= n^2。

5.心得体会:

一开始对动态规划不太熟悉和理解,通过做题目,思考和编程,加深了自己对动态规划方法的理解和深入的认识,锻炼了自身的思维,也提高了自己的编程水平。

 

 
posted @ 2019-10-21 22:56  方子禧  阅读(135)  评论(0编辑  收藏  举报