记忆化搜索的题目,没法用递推。
#include<bits/stdc++.h>
using namespace std;
//dp[i][j]表示以(i,j)为终点的最长上升子序列的长度
int H,L,ans,dp[110][110],m[110][110];
int x[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int f(int h,int l){
if(dp[h][l]!=0) return dp[h][l];//记忆化搜索
dp[h][l]=1;//初始化
for(int i=0;i<4;i++){
int hh=h+x[i][0],ll=l+x[i][1];
if(hh>0&&hh<=H&&ll>0&&ll<=L&&m[hh][ll]<m[h][l]){
dp[h][l]=max(f(hh,ll)+1,dp[h][l]);
}
}
return dp[h][l];
}
int main(){
cin>>H>>L;
for(int i=1;i<=H;i++){
for(int j=1;j<=L;j++){
cin>>m[i][j];
}
}
//每个点都要算一次是因为未必从一个点就能到达所有点
for(int i=1;i<=H;i++){
for(int j=1;j<=L;j++){
f(i,j);
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
}