poj 1088 滑雪(動態規劃:記憶化搜尋)
阿新 • • 發佈:2019-01-29
這個題開始想著用動態規劃遞推來做的
但是根本不知從哪裡下手
想了下還是記憶化更方便
我的方法是先把邊界設定為無窮大
每次dfs知道當前點周圍沒有比它還低的位置即可
0ms程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #define MAXN 110 #define INF 0x7fffffff using namespace std; int r, c; int a[MAXN][MAXN], dp[MAXN][MAXN]; int dfs(int i, int j) { if(dp[i][j]) return dp[i][j]; int tmp = 0; if(a[i][j]>a[i-1][j]) tmp = max(tmp, dfs(i-1, j)); if(a[i][j]>a[i+1][j]) tmp = max(tmp, dfs(i+1, j)); if(a[i][j]>a[i][j-1]) tmp = max(tmp, dfs(i, j-1)); if(a[i][j]>a[i][j+1]) tmp = max(tmp, dfs(i, j+1)); dp[i][j] = tmp+1; return dp[i][j]; } int main(void) { while(~scanf("%d%d", &r, &c)) { for(int i=1; i<=r; ++i) for(int j=1; j<=c; ++j) scanf("%d", &a[i][j]); memset(dp, 0, sizeof(dp)); for(int i=0; i<=r; ++i) a[i][0] = a[i][c+1] = INF; for(int i=1; i<=c; ++i) a[0][i] = a[r+1][i] = INF; int ans = 0; for(int i=1; i<=r; ++i) { for(int j=1; j<=c; ++j) { ans = max(ans, dfs(i, j)); } } printf("%d\n", ans); //print(); } return 0; }