演算法訓練 數字三角形
徑,使該路徑所經過的數字的總和最大。
●每一步可沿左斜線向下或右斜線向下走;
●1<三角形行數≤100;
●三角形中的數字為整數0,1,…99;
.
(圖3.1-1) 輸入格式 檔案中首先讀到的是三角形的行數。
接下來描述整個三角形 輸出格式 最大總和(整數) 樣例輸入 5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 樣例輸出 30 這一道題首先很容易想到的是遞迴,遍歷所有的路徑,然後找出最大值,但是,可惜的是超時。 我們需要的是從倒數第二行倒著看,你會發現一個規律。 我們以一個串序號為例 1 2 3 4 5 6 7 8 9 10 先看倒數第二行 4 = max(7,8) + 4 5 = max(8,9) + 5 6 = max(9,10) + 6 接著向上一行 2 = max(4,5) + 2 3 = max(5,6) + 3 接著向上一行 1 = max(2,3) + 1 規律很明顯就找出來了 原始碼: #include <iostream>
#include <algorithm>
using namespace std;
#define max_m 104
using namespace std;
int num[max_m][max_m], n;
int main()
{
int i, j;
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
{
cin >> num[i][j];
}
for (i = n - 1; i >= 1; i--)
for (j = 1; j <= i; j++)
{
num[i][j] = num[i][j] + max(num[i+1][j],num[i+1][j+1]);
}
cout << num[1][1] << endl;
}