算法第3章上机实践报告
1. 实践题目
7-1 数字三角形
2. 问题描述
计算出从三角形的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
3. 算法描述
for(int i=1; i<=n; i++) for(int j=1; j<=i; j++){ cin >> a[i][j]; m[i][j] = a[i][j];//设置两个数组,一个保留为原来的数据,另外一个用来记录数据 } for(int i = n-1; i >0 ; i--){ for(int j = 1; j <= i; j++){ //自底向上记录数据 m[i][j] +=max(m[i+1][j],m[i+1][j+1]); //选择大的数字进行相加 } } cout << m[1][1] << endl;
4. 算法时间及空间复杂度分析:
时间复杂度分析:一共有4个for循环,两两组合在一起,其一组循环的时间复杂度为O(n*n) = O(n2),另一组循环的时间复杂度为O((n-1)*(n-1) = O(n2),总的时间复杂度为O(2n2) = O(n2)
空间复杂度分析:由于设置的是二维数组,所以空间复杂度为S(n2)
5. 心得体会:
一开始跟队友两个人的想法偏差较大,讨论了很久都没有结果,就先分开写代码,但是都存在一些问题,又再一起讨论,快下课的时候还是有点不太理解,就跟旁边的一组同学讨论了一下,最后得出。