算法第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.心得体会(对本次实践收获及疑惑进行总结)

  一开始是想着从上往下的,后来发现这样的递归方程很难写,它的值很多种可能。跟队友讨论后,又参考了书上的例题,我们决定从底向上算。这样一来,计算值变得简单多了,递归方程也很容易写出来了。我觉得我们考虑问题的时候,要善于从多个方向去考虑,发现这个方向不行时,要懂得放弃,寻找另一个解决方法。

posted @ 2018-11-11 22:58  lasia_LWL  阅读(133)  评论(0)    收藏  举报