这道题可以拿搜索做,不过我觉得DP更省点时间,也好理解,多开了一点点内存空间。
记录所有的点的信息,按高度排序,然后再依照高度去找点,标记在一个二维数组里,并记录其中最大的权值。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[105][105],dp[105][105];
struct point
{
int i,j;
int h;
};
point b[10002];
bool cmp(point x,point y)
{
return x.h<y.h;
}
int main()
{
int n,m,i,j,k,I,J,M;
while(~scanf("%d%d",&n,&m))
{
k=0;
for(i=0; i<=101; i++)
{
for(j=0;j<=101;j++)
a[i][j]=10002;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
b[k].h=a[i][j];
b[k].i=i;
b[k].j=j;
k++;
}
}
sort(b,b+k, cmp);
memset(dp,0,sizeof(dp));
M=0;
for(i=0; i<k; i++)
{
I=b[i].i,J=b[i].j;
if(a[I+1][J]<a[I][J]&&dp[I][J]<dp[I+1][J]+1)
dp[I][J]=dp[I+1][J]+1;
if(a[I][J+1]<a[I][J]&&dp[I][J]<dp[I][J+1]+1)
dp[I][J]=dp[I][J+1]+1;
if(a[I-1][J]<a[I][J]&&dp[I][J]<dp[I-1][J]+1)
dp[I][J]=dp[I-1][J]+1;
if(a[I][J-1]<a[I][J]&&dp[I][J]<dp[I][J-1]+1)
dp[I][J]=dp[I][J-1]+1;
if(dp[I][J]>M)
M=dp[I][J];
}
printf("%d\n",M+1);
}
return 0;
}