就是求一個矩陣從下邊走到上邊,能夠走本身前方或左前方或右前方.
問走到上邊一共通過的路徑和.ios
類型題:P1216git
參考上邊的類型題(由於比較簡單),咱們能夠從上邊開始反着走走到下邊.spa
反着走的話,咱們能夠知道當前這個地方的權值是由下方,左下方,走下方走來的.code
由於問的是吃的能量最多,咱們就取在三個地方中取一個max而後再加上當前這個地方的權值.get
用一個式子能夠表示爲. f[i][j] = max(f[i - 1][j] , f[i - 1][j - 1], f[i - 1][j + 1]) + a[i][j];string
f[i][j] 表示吃到這個地方一共能夠吃到的最大能量值,it
a[i][j] 表示這個地方食物的能量值.io
#include <iostream> #include <cmath> #include <cstring> #include <cstdio> #include <algorithm> #define A 210 using namespace std; int n, m, map[A][A]; int ans; int read() { int s = 0, f = 0; char ch = getchar(); while (!isdigit(ch)) f |= (ch == '-'), ch = getchar(); while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar(); return f ? -s : s; } int main(){ n = read(), m = read(); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) map[i][j] = read(); for(int i = 2; i <= n; i++){ for(int j = 1; j <= m; j++){ int a = max(map[i - 1][j - 1], map[i - 1][j]); map[i][j] += max(a, map[i - 1][j + 1]); } } ans = max(map[n][m / 2], map[n][m / 2 + 1]); ans = max(ans, map[n][m / 2 + 2]); cout<<ans; }