POJ 1163 The Triangle
阿新 • • 發佈:2018-09-07
bitset poj str href 選擇 bits script ems 開始
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
題目鏈接:POJ 1163
Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
上圖的數字三角形表示一個迷宮,每個數字代表此處的金幣數。鵬神從上端頂點出發,要走到底邊,每一步都只能向下走,但可以選擇向正下方走,或者向右下方一格走。你需要幫助鵬神計算出他最多能得到多少金幣。
Input
輸入包含多組數據,處理至文件結束。
第一行為一個正整數N:表示數字三角形的行數。(1<N≤100)
接下來N行用來輸入數字三角形迷宮每個位置的金幣數。其中所有數字大小都在0到99之間。
Output
對於每組輸入數據,輸出一個數,即鵬神最多所能得到的金幣數。
Sample Input
5
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
Hint
測試樣例中,鵬神的走法為:↓↓↘↓,即:7-3-8-7-5,總和為30。
題意
給出一個金字塔樣子的幾行數,求一條路徑,從頂點出發,每次向下只能走當前的下面和下面右邊一格,問走到最底時可以獲得的最高分數,也就是經過的數字之和最大。
題解:
DP經典題目,狀態轉移式也顯而易見了,從倒數第二層開始向上,dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j],最後輸出dp[0][0]。
代碼
#define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<cstring> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int N = 2e5 + 5; const int maxn = 110; int dp[maxn][maxn]; int main() { int n; while (cin >> n) { memset(dp, 0, sizeof dp); for (int i(0); i < n; i++) for (int j(0); j <= i; j++) cin >> dp[i][j]; for (int i(n - 2); i >= 0; i--) for (int j(0); j <= i; j++) dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j]; cout << dp[0][0] << endl; } return 0; }
POJ 1163 The Triangle