搜索比较麻烦,感觉还是dp好.其实和搜索差不太多,dp[i][j]只能从四个方向走过来,而且四个方向的点的高度要大于这个点,于是就可以了.
还是很简洁的
```cpp
#include<bits/stdc++.h>
using namespace std;
int read()
{
char s;
int k=0,base=1;
while((s=getchar())!='-'&&s!=EOF&&!(s>='0'&&s<='9'));
if(s==EOF)exit(0);
if(s=='-')base=-1,s=getchar();
while(s>='0'&&s<='9')
{
k=k*10+(s-'0');
s=getchar();
}
return k*base;
}
void write(int x)
{
if(x<0)
{
putchar('-');
write(-x);
}
else
{
if(x/10)write(x/10);
putchar(x%10+'0');
}
}
int f[105][105];
int a[105][105];
int n,m,sum;
int dp(int x,int y)
{
if (f[x][y]) return f[x][y];//直接返回值
int sum=0;
if (x-1>0) if (a[x-1][y]>a[x][y]) sum=max(sum,dp(x-1,y));
if (x+1>0) if (a[x+1][y]>a[x][y]) sum=max(sum,dp(x+1,y));
if (y-1>0) if (a[x][y-1]>a[x][y]) sum=max(sum,dp(x,y-1));
if (y+1>0) if (a[x][y+1]>a[x][y]) sum=max(sum,dp(x,y+1));
f[x][y]=sum+1;//找max
return f[x][y];
}
int main()
{
n=read();
m=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
a[i][j]=read();
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (f[i][j]==0) f[i][j]=dp(i,j);
sum=max(sum,f[i][j]);//更新答案
}
printf("%d",sum);//输出
return 0;
}
```
dp是0ms啊,没毛病