算法第3章上机实践报告


实践报告任选一题进行分析。内容包括:

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

2.问题描述:根据题目我们可以大致画出动态规划的一个表,大致可以用一个“下三角”的数组来表示,不断地求最优子结构最终得到问题的最优解。

3.算法描述:动态规划,由下面不断加到上面,然后每一次都找到最优子结构,并记录对应的值,经过对比最后在最顶端得到总和最大的值。

4.算法实间空间复杂度分析:(代码如下)

#include <iostream>
using namespace std;
int max(int a,int b){
if(a>=b) return a;
else return b;

}
int sum(int n,int (*a)[101]){
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++){
a[i][j]=max(a[i+1][j+1],a[i+1][j])+a[i][j];
}cout<<a[1][1];
}
int main(){
int n;
int a[101][101];
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
sum(n,a);
}

 

实践复杂度,由于包含两个主要的循环,得 n+(n-1)+....+1=(n*n+n)/2

所以得时间复杂度为O(n*n);

空间复杂度为 (n*n);

心得体会(对本次实践收获及疑惑进行总结):

这道题目一开始还不是很知道思路,一开始老是想着不用动态规划去做,后来尝试了一下和搭档用动态规划的办法去做这道题目的时候,又发现了不知道怎么在函数里面写,然后针对怎么记忆子结构的值又不是特别清楚,最终经过不断地尝试,发现重头到尾都用一个

a[][] a的二维数组表示,程序就通过了,然后发现这题他在循环体里会自动记忆的,所以就知道了编码的问题。还有一个问题就是,如何调用带二维数组的函数问题,我发现这个涉及到了部分指针的问题,最后在老师的指导下发现,在函数的小括号里写 a(*)[整型],然后再在主函数直接sum(n,a)就可以了 这是由于二维数组列不能省略导致的,今后在这方面就知道怎么做了。

posted on 2018-11-04 15:54  suanfasfather  阅读(122)  评论(0编辑  收藏  举报

导航