算法第三章上机实践报告
实践题目:
7-1 数字三角形
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
QQ截图20170929023616.jpg
输入格式:
输入有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
这道题不难发现输入的数构成了一正三角:第n行就有n个数。求最大路径,首先要明白每从一个数出发,接着就只能选择下一行在该数下面的两个数的中最大的一个。接着因为第一行只有一个数,肯定会被选中,因此我们可以由下往上计算最大路径。
代码如下:
int Max(int a,int b){
if(a>=b){
return a;}
else
return b;
}
int main()
{
int a[100][100],b[100][100],n;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin>>a[i][j];
b[i][j]=a[i][j];}}
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
b[i][j]+=Max(b[i+1][j],b[i+1][j+1]);}}
cout<<b[0][0];
return 0;
}
Max算法用来比较相邻两个数的大小,谁大返回谁,主函数只能创建了两个二维数组,开始用来存放输入的三角形数据值。接着从三角形的倒数第二行(因为最后一行下面没有数了)的第一个数开始,这一行的每个数的值=原值+下一行在它下面两个数其中较大者。倒数第三,第四……到第一行,以此类推,都是存放着从最后一行到当前行的最大路径数值,最后输出第一个数,就是整个三角形的最大路径。
时间复杂度为n的3次方,取决于for(int i=n-2;i>=0;i--)及for(int j=0;j<=i;j++)的双层循环,前者是(n*(n+1))/2,后者是n,两者相乘为n的3次方。空间复杂度为O(1),因为空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。从代码来看,一开始便创建了两个等长数组,过程中也不存在创建临时空间,因此为O(1)。
心得体会:两个人一起解决的速度,质量会比一个人好。但是我对空间复杂度还是不太熟悉,需要多看书。会好好记住这种类型的题,希望能举一反三。