/* 題型:記憶化動歸 注意哪裏return,返回的是一個i,j的dp的值 */ #include<cstdio> #include<algorithm> using namespace std; const int maxn=102; int n,m; int map[maxn][maxn]; int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向數組 int ans=0; int f[maxn][maxn]; bool jilu[maxn][maxn]; int dp(int x,int y)//一個i,j的dp { if(jilu[x][y]) return f[x][y];//記憶化 jilu[x][y]=1;//即visited或mark int tp=0; for(int i=0;i<4;i++) { int newx=x+d[i][0]; int newy=y+d[i][1]; if(map[newx][newy]<map[x][y] && newx>=1 && newy>=1 && newx<=n && newy<=m)//判斷出界 tp=max(tp,dp(newx,newy)); } f[x][y]=tp+1;//等都判斷完了,路程加本身的1 return f[x][y]; } int main() { scanf("%d%d",&n,&m);//長寬 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) ans=max(ans,dp(i,j));//ans記錄所有f(i,j)的最大值,由於記憶化的存在,多次調用dp並不會很慢 } printf("%d",ans); return 0; }