UAV -10285 Longest Run on a Snowboard (記憶化搜尋)
阿新 • • 發佈:2018-12-13
題目大意:
從矩陣中任意一個點出發,只要它上下左右的任意一個比它的數小,它就能向那個小的數字走一步,問在這個圖中走的最大的步數
題目分析:
如果用暴力搜尋的話可能會很麻煩,很費事,所以很典型的記憶化搜尋
Code:
#include<iostream> #include<cstring> #include<cstdio> /* DP記憶化搜尋 */ using namespace std; const int maxn = 110; int G[maxn][maxn]; int dp[maxn][maxn]; int dx[4] = {0, 1, -1, 0}; int dy[4] = {1, 0, 0, -1}; int m, n; int DP(int x, int y) { //int &ans = dp[x][y]; if(dp[x][y] != -1) return dp[x][y]; for(int k = 0; k < 4; k++){ int xx = x + dx[k], yy = y + dy[k]; if(xx >= 0 && xx < m && yy >= 0 && yy < n && G[xx][yy] < G[x][y]){ dp[x][y] = max(dp[x][y], DP(xx, yy)+1); } } if(dp[x][y] == -1) dp[x][y] = 1; return dp[x][y]; } int main() { int T; scanf("%d", &T); while(T--){ string str; cin >> str >> m >> n; memset(G, 0, sizeof(G)); memset(dp, -1, sizeof(dp)); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++) scanf("%d", &G[i][j]); } int maxx = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++) maxx = max(DP(i, j), maxx); } cout << str << ": " << maxx << endl; } return 0; }