滑雪 POJ - 1088 (記憶化搜尋/動態規劃)
阿新 • • 發佈:2018-11-06
題意:找出一條降序的路徑,使得這條路徑最長,輸出長度即可。
題解:對於每個點都進行dfs,dfs的同時進行記憶化搜尋即可。
附上程式碼:
#include<iostream> #include<cstdio> using namespace std; const int maxn=1e2+50; int h[maxn][maxn],ans,f[maxn][maxn],t,n,m; int Next[][2]={{0,1},{1,0},{0,-1},{-1,0}}; int dfs(int x,int y) { if(f[x][y]){ return f[x][y]; } int t=1; for(int i=0;i<4;i++){ int nx=x+Next[i][0],ny=y+Next[i][1]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&h[x][y]>h[nx][ny]){ t=max(dfs(nx,ny)+1,t); } } f[x][y]=t; return t; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&h[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dfs(i,j); ans=max(ans,f[i][j]); } } printf("%d\n",ans); return 0; }
還有一種動態規劃解法: