1. 程式人生 > >POJ 1163 The Triangle

POJ 1163 The Triangle

bitset poj str href 選擇 bits script ems 開始

題目鏈接: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

7
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