好怀念。。第一道自己AC的DP
记忆化搜索
(好久以前写的有点难看见谅233
<span style="font-size:18px;">#include<iostream>
#include<cstring>
#define maxn 1005
using namespace std;
int m,n,G[maxn][maxn],dp[maxn][maxn];
bool vis[maxn][maxn];
const int mx[4]={1,-1,0,0};
const int my[4]={0,0,1,-1};
void init(void){
cin>>m>>n;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
G[i][j]=maxn;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
int x;cin>>x;
G[i][j]=x;
}
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
}
int solve(int x,int y){
int t=0;vis[x][y]=1;int mark=1;
for(int i=0;i<4;i++){
int tx=x+mx[i],ty=y+my[i];
if(G[tx][ty]<G[x][y]){
mark=0;
if(vis[tx][ty])t=max(dp[tx][ty]+1,t);
else{
solve(tx,ty);
t=max(dp[tx][ty]+1,t);
}
}
}
if(!mark)dp[x][y]=t;
else dp[x][y]=1;
return dp[x][y];
}
int main(){
init();
int ans=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(!vis[i][j]){
solve(i,j);
if(ans<dp[i][j])
ans=dp[i][j];
}
}
}
cout<<ans;
return 0;
}</span>