算法第三章上机实践报告
(一)实践题目:数字三角形
(二)问题描述:
给定一个由 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)
(五)心得体会
用备忘录提高效率节省时间。
浙公网安备 33010602011771号