算法第3章上机实践报告
1.实践题目
7-1 数字三角形
2.问题描述
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
3.算法描述
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int n = input.nextInt(); int a[][] = new int [101][101]; int b[][]=new int [101][101]; for(int i=1;i<=n;i++){ for(int k=1;k<=i;k++){ a[i][k]=input.nextInt(); } } for(int i=1;i<=n;i++){ b[n][i]=a[n][i]; } for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++){ if(b[i+1][j+1]>b[i+1][j]){ b[i][j]= b[i+1][j+1]+a[i][j]; } else{ b[i][j]=b[i+1][j]+a[i][j]; } } } System.out.print(b[1][1]); } }
设 a[ i ] [ k ]表示数字三角形中的第 i 行第 k 个点。
b[i][j]表示 第 i 行 第 j 个数字到低端的最佳路径之和,则原问题的解就是 b[1][1] 的值了。
从a[ i ] [ k ] 这个点向下走,显然只能走 a[ i+1 ] [ k ] 和 a[ i+1 ] [ k+1 ]这两个点了。
而 b[i][j] 的值 = a[ i ] [ j ] 的值 + max{ b [i+1] [ j ] ,b[ i+1 ] [ j+1] }。
所以,我们可以至底向上来计算。先计算最后一层的点的,然后倒数二层的,……,一直算到第一层。
4.算法时间及空间复杂度分析(要有分析过程)
时间复杂度为O( n² ),输入a[ i ] [ k ]和计算b[ i ][ j ]的值需要用到双重循环
空间复杂度为O( n² ),需要2个二维空间,所以为O( n² )
5.心得体会(对本次实践收获及疑惑进行总结)
一开始是想着从上往下的,后来发现这样的递归方程很难写,它的值很多种可能。跟队友讨论后,又参考了书上的例题,我们决定从底向上算。这样一来,计算值变得简单多了,递归方程也很容易写出来了。我觉得我们考虑问题的时候,要善于从多个方向去考虑,发现这个方向不行时,要懂得放弃,寻找另一个解决方法。
浙公网安备 33010602011771号