1. 程式人生 > 實用技巧 >數字三角形 Number Triangles

數字三角形 Number Triangles

數字三角形 Number Triangles

我的第200道題目.

可以當成動態規劃的模板了,非常簡單.主要是想先把動態規劃的內容回憶起來,先前覺得難跳過了這一部分的刷題.

通過這種方式儲存資料後,即可用s[i][j]來表示第i行第j個數,且d[i + 1][j], d[i + 1][j + 1]分別表示該數字左下方和右下方的數字.

要退出最大路徑,從最後一行往上推,用dp[i][j]儲存從位置(i,j)到最後一行能產生的最大路徑.那麼:

dp[n][j] = s[n][j].

dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + s[i][j].(注意第i + 1行是第i行的下一行)

實現如下:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int n;
int s[1010][1010], dp[1010][1010];

int rec(){
    for(int i = n; i >= 1; i--)
        for(int j = 1; j <= i; j++)
            dp[i][j] = max(dp[i + 1][j], dp[i + 1
][j + 1]) + s[i][j]; return dp[1][1]; } int main(){ cin >> n; for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) cin >> s[i][j]; printf("%d\n", rec()); return 0; }
View Code

注意到不需要先初始化dp[n][j],在第一次迴圈時已經使得dp[n][j] = dp[n + 1][j] + s[n][j],dp[n + 1][j]初始值為0,效果即dp[n][j] = s[n][j].

最後輸出最高點到最後一行能產生的最大路徑dp[1][1]即答案.