算法第三章上机实践报告

(一)实践题目:数字三角形

(二)问题描述:

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

(三)算法描述:

#include <iostream>
#include <algorithm>
using namespace std;

int a[100][100];
int n;
int maxSum[100][100];

int sum(int i, int j) {
    if(maxSum[i][j] != -1) {
        return maxSum[i][j];
    }
    if(i == n) {
        maxSum[i][j] = a[i][j];
    }
    else {
        int num1 = sum(i+1,j);
        int num2 = sum(i+1,j+1);
         maxSum[i][j] = max(num1, num2) + a[i][j];
    }
    return maxSum[i][j];
}

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

maxSum[i][j] = a[i][j];       (n == i);  maxSum[i][j] = max(sum(i+1, j), sum(i+1,j+1)) + a[i][j];

最底一排的maxSum为这一排最大的,再往上求。
避免重复从最底端计算,减小时间复杂度。
 
(四)算法时间和空间复杂度分析:
每次填表需要比较并且做加法,时间复杂度O(n^2)
二维数组,空间复杂度O(n^2)
 
(五)心得体会
用备忘录提高效率节省时间。