18.滑雪 記憶化搜尋
阿新 • • 發佈:2020-07-06
按照第一步往哪滑分類
分成四類
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 310; 4 int h[N][N]; //h表示每個點的高度 5 int f[N][N]; //動態規劃陣列 6 int n, m; 7 int dx[4] = {-1, 0, 1, 0}; 8 int dy[4] = {0, 1, 0, -1}; //四個方向 9 int dp(int x, int y) { //dp(i, j)是求出這個狀態然後返回 10 int &v = f[x][y]; //引用11 if (v != -1) { //表示已經被算過了 12 return v; 13 } 14 v = 1; //最差最差可以走當前這一個點 15 for (int i = 0; i < 4; i++) { 16 int a = x + dx[i]; 17 int b = y + dy[i]; 18 if(a >= 1 && a <= n && b >= 1 && b <= m && h[a][b] < h[x][y]) {19 v = max(v, dp(a, b) + 1); 20 } 21 } 22 return v; 23 } 24 int main() { 25 cin >> n >> m; 26 for (int i = 1; i <= n; i++) { 27 for (int j = 1; j <= m; j++) { 28 cin >> h[i][j]; 29 } 30 } 31 memset(f, -1, sizeoff); //表示每個狀態都沒有被算過 32 int res = -1; //最大值 33 for (int i = 1; i <= n; i++) { 34 for (int j = 1; j <= m; j++) { 35 res = max(res, dp(i, j)); 36 } 37 } 38 cout << res << endl; 39 return 0; 40 }