传送门(洛谷)
标准记忆化搜索
Code
/***************************
* Time 2019.8.1
* User mzg1824_TY
* Algrothim 记忆和搜索
***************************/
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define don(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)
using namespace std;
const int maxn=1e6+10;
const int maxm=1e3+10;
int m,n;
int a[maxm][maxm],f[maxm][maxm];
int dx[]={0, 0,-1,1};
int dy[]={1,-1, 0,0};
template <class t> inline void read(t &x)
{
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
template <class t> inline void write(t x) {
if(x<0) {putchar('-');x=~x+1;}
if(x>9) write(x/10);
putchar(x%10+48);
}
void readdata()
{
read(n),read(m);
rep(i,1,n)
rep(j,1,m) {
read(a[i][j]);
}
}
inline int dfs(int x,int y) {
int sum=1;//初值一定记着赋为1!!
if(x<1 || x>n || y<1 || y>m) return f[x][y];//如果越界了,直接返回上一级的值
if(f[x][y]) return f[x][y];
rep(i,0,3) {//四个方向
int nx=x+dx[i];
int ny=y+dy[i];
if(a[nx][ny]>a[x][y]) {
sum=max(dfs(nx,ny)+1,sum);//记住一个方向的最大值
}
}
f[x][y]=sum;//更新
return f[x][y];
}
void work()
{
int ans=0;
rep(i,1,n)
rep(j,1,m) {
ans=max(ans,dfs(i,j));//从任意起点开始搜索
}
write(ans);
}
int main()
{
//freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}