第三章上机实践
1、时间题目
7-1 数字三角形
2、题目描述
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
输入格式:
输入有n+1行:
第 1 行是数字三角形的行数 n,1<=n<=100。
接下来 n行是数字三角形各行中的数字。所有数字在0..99 之间。
输出格式:
输出最大路径的值。
3、算法描述
开辟两个随n而定的二维数组存放,A数组输入数据另一个待用,
将最后一行的数据赋值给B数组,然后双重循环遍历一下B数组,从后向前覆盖,
从倒数第二行,在B中按顺序交叉选择下一行的数据中的相临的两个数据中比较大的加上A数组在当前
遍历的这一行的数据(这里即倒数第二行),赋值给B的倒数第二行,接着到倒数第三行,还是同样的方法,
选择倒数第二行中的数据加上A数组在这一行的数据(这里是倒数第三行),然后赋值给B的倒数第三行;
一次类推下去,B【1】【1】就会是一个最大值的累计。
将其输出即可。
源代码如下:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cin>>n; 7 int *A[n+1],*B[n+1]; 8 for(int i=0;i<=n;i++) 9 { 10 A[i]=new int [n+1]; 11 B[i]=new int [n+1]; 12 } 13 for(int i=1;i<=n;i++) 14 { 15 for(int j=1;j<=i;j++) 16 { 17 cin>>A[i][j]; 18 } 19 } 20 for(int i=1;i<=n;i++) 21 { 22 B[n][i]=A[n][i]; //从后面往前覆盖 23 } 24 for(int i=n-1;i>=1;i--) 25 { 26 for(int j=1;j<=i;j++) 27 { 28 B[i][j]=(B[i+1][j]>B[i+1][j+1]?B[i+1][j]:B[i+1][j+1])+A[i][j]; 29 } 30 } 31 cout<<B[1][1]<<endl; 32 return 0; 33 }
4、算法时间复杂度:
O(n·2+n+n+n+n)即是O(n~2)
5、心得体会
在实现算法的过程中思维有点混乱,经常会是你想到了那个点,直到小问题就在那里,但是你就是无法准确的找到它,
并且解决,很难以去发现错误点,而结对编程往往有利于这一问题 的解决。在解决此类算法过程中,有时候可能会偏离
题目,使得设计出来的算法很难懂,感觉很复杂,但其实这类算法问题都是有一个直接的思维方法的。如果感到思路很复杂的话,还是可以重新整理一下思路,然后重新思考的,因为复杂的想法纠结下去浪费时间又解不出题目来。所以在解决这类
问题上还是得多花点心思,打通这类问题的共同之处,不要将问题复杂化。
c S