DFS+DP【洛谷P1434】
阿新 • • 發佈:2018-12-16
本來以為是很簡單得一個題目,直接暴力搜一遍圖,儲存一個最大值,結果T了qwq。
直接上思路:這其實是一道dp的題目,方程很好退,我就不放了(我也不是dp做的)
DFS+記憶化搜尋就可以過了,而且速度很快。
dfs(x,y)表示走到(x,y)的時候的步數。
直接上程式碼比較清晰:
#include <bits/stdc++.h> using namespace std; const int maxn = 110; int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; int G[maxn][maxn]; int f[maxn][maxn]; int r,c; int cnt,ans; void init() { memset(G,0,sizeof(G)); memset(f,-1,sizeof(f)); } int dfs(int x,int y) { if(f[x][y]!=-1) { return f[x][y]; } int tmp = 0,mx = 1; for(int i=0;i<4;i++) { int nx = x+dx[i]; int ny = y+dy[i]; if(nx>=1 && nx<=r && ny>=1 && ny<=c && G[x][y]>G[nx][ny]) { tmp = dfs(nx,ny)+1; mx = max(mx,tmp); } } return f[x][y] = mx; } int main() { while(cin>>r>>c) { init(); ans = 0; for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { cin>>G[i][j]; } } for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { cnt = dfs(i,j); ans = max(ans,cnt); } } cout<<ans<<endl; } return 0; }