对于每一个位置 到底该向哪个方向前进 这显然是不确定的
但是对于每一个位置 是从哪个方向来的是肯定的 要从四个方向中比该位置高且高出的部分最小的一个方向来
DP很多都要逆序考虑 从高到低(从低到高亦可)按上述原则走一遍即可
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int h;
int x;
int y;
};
node grid[10010];
int h[110][110],dp[110][110];
int n,m,num;
int cmp(node n1,node n2)
{
return n1.h<n2.h;
}
int main()
{
int next[4][2]={0,-1,-1,0,0,1,1,0};
int i,j,tx,ty,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
num=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&h[i][j]);
num++;
grid[num].h=h[i][j];
grid[num].x=i;
grid[num].y=j;
}
}
sort(grid+1,grid+num+1,cmp);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
dp[i][j]=1;
}
}
for(i=1;i<=num;i++)
{
for(j=0;j<4;j++)
{
tx=grid[i].x+next[j][0];
ty=grid[i].y+next[j][1];
if(tx<1||tx>n||ty<1||ty>m||h[tx][ty]>=h[grid[i].x][grid[i].y])
{
continue;
}
dp[grid[i].x][grid[i].y]=max(dp[grid[i].x][grid[i].y],dp[tx][ty]+1);
}
}
ans=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return 0;
}