NightTide @ 2021-12-11 15:10:47
写的是记忆化搜索
#include<bits/stdc++.h>
#define MAXN 710
using namespace std;
const int mve[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct edge{
int pre,to;
};
int n,m;
int high[MAXN][MAXN],num[MAXN][MAXN];
edge e[MAXN*MAXN*4];
int head[MAXN*MAXN],cnt;
bool vis[MAXN*MAXN],ski[MAXN][MAXN];
int dis[MAXN*MAXN];
char type[5];
int a,b,c,d;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0',ch=getchar();
}
return s*w;
}
void add_edge(int u,int v){
e[++cnt].pre=head[u];
e[cnt].to=v; head[u]=cnt;
}
void build(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<4;k++){
// if(ski[i][j]||ski[i+mve[k][0]][j+mve[k][1]]) continue;
if(i+mve[k][0]<1||i+mve[k][0]>n||j+mve[k][1]<1||j+mve[k][1]>m) continue;
dis[num[i][j]]=1;
if(high[i][j]>high[i+mve[k][0]][j+mve[k][1]]){
add_edge(num[i][j],num[i+mve[k][0]][j+mve[k][1]]);
}
}
}
}
}
void dfs(int now){
int res=0;
vis[now]=true;
for(int i=head[now];i;i=e[i].pre){
if(vis[e[i].to]) res=max(res,dis[e[i].to]);
else{
dfs(e[i].to);
res=max(res,dis[e[i].to]);
}
}
dis[now]+=res;
}
int main(){
// freopen("ski.in","r",stdin);
// freopen("ski.out","w",stdout);
// n=read();
// m=read();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&high[i][j]);
// high[i][j]=read();
num[i][j]=n*(i-1)+j;
}
}
//建图
build();
int ans=0;
for(int i=1;i<=n*m;i++) dis[i]=1;
//记忆化搜索
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!vis[num[i][j]]){
dfs(num[i][j]);
ans=max(ans,dis[num[i][j]]);
}
}
}
printf("%d\n",ans);
return 0;
}