算法第三章上机实践报告
1.实践题目:
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
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.心得体会:
一开始对动态规划不太熟悉和理解,通过做题目,思考和编程,加深了自己对动态规划方法的理解和深入的认识,锻炼了自身的思维,也提高了自己的编程水平。