數字三角形 Number Triangles
阿新 • • 發佈:2020-12-02
我的第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 + 1View Code][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; }
注意到不需要先初始化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]即答案.