需求
描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得
路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或
右下走。只需要求出這個最大和即可,不必給出具體路徑。
三角形的行數大於1小於等於100,數字爲 0 - 99
輸入
5 //三角形行數。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
輸出
要求輸出最大和
分析
從下朝上逆推。
arr[i][j]的數與一下行數字的最大值
相當於arr[i+1][j]與arr[i+1][j+1]中的最大值 與 arr[i][j]之和。
狀態轉移方程
max[i][j] 代表i行j列的數字到底邊的最大路徑。
代碼
#include <iostream>
#include <algorithm>
using namespace std;
int arr[101][101];
int main() {
// freopen("f:\\data.txt", "r", stdin);
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
cin >> arr[i][j];
}
}
int* res = arr[N];
for (int i = N - 1; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
res[j] = arr[i][j] + max(res[j], res[j + 1]);
}
}
cout << *max_element(res, res + N) << endl;
res = NULL;
return 0;
}