1. 程式人生 > 實用技巧 >18.滑雪 記憶化搜尋

18.滑雪 記憶化搜尋

按照第一步往哪滑分

分成四類

 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, sizeof
f); //表示每個狀態都沒有被算過 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 }