某類型的DP問題。
題目概述:
給定一個數字三角,第一行1個第二行2個以此類推,我們要計算出來每一行取一個數(每相鄰兩個數在三角中的位置必須相鄰),然後這樣能夠得到的最大結果是多少。
算法思想:
題解中全是DP,從最下層往上歸納,但是我沒有依照這種方法,我用的是先讀取所有數組,然後從上往下改數組的值這樣做,也成功了。
BTW,可以用滾動數組優化空間複雜度~
滾動數組這個東西還是找時間看一下吧!
代碼部分:
#include <iostream> #include <fstream> #include <queue> using namespace std; ifstream fin("numtri.in"); ofstream fout("numtri.out"); int n; int a[1117][1117]; int main() { fin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { fin >> a[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { if (i == 1) continue; if (j == 1) { a[i][j] += a[i - 1][j]; continue; } if (j == i) { a[i][j] += a[i - 1][j - 1]; continue; } a[i][j] += max(a[i - 1][j], a[i - 1][j - 1]); } } int res = 0; for (int i = 1; i <= n; i++) { res = res > a[n][i] ? res : a[n][i]; } fout << res << endl; return 0; }