https://www.luogu.org/problemnew/show/P1434
用dp写了,把所有的点以及他们的坐标装结构体里,按值从小到大排个序,再遍历一遍
dp[num[i].x][num[i].y]=上下左右最大dp值加1;
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
int N,M,a[105][105],dp[105][105];
struct DM
{
int val,x,y;
} num[10005];
bool cmp(DM a,DM b)
{
return a.val<b.val;
}
int check(int i)
{
int sum=0;
if(num[i].x-1>=1&&a[num[i].x-1][num[i].y]<a[num[i].x][num[i].y])sum=max(sum,dp[num[i].x-1][num[i].y]);
if(num[i].x+1<=N&&a[num[i].x+1][num[i].y]<a[num[i].x][num[i].y])sum=max(sum,dp[num[i].x+1][num[i].y]);
if(num[i].y-1>=1&&a[num[i].x][num[i].y-1]<a[num[i].x][num[i].y])sum=max(sum,dp[num[i].x][num[i].y-1]);
if(num[i].y+1<=N&&a[num[i].x][num[i].y+1]<a[num[i].x][num[i].y])sum=max(sum,dp[num[i].x][num[i].y+1]);
return sum+=dp[num[i].x][num[i].y];
}
int main()
{
scanf("%d%d",&N,&M);
int cnt=0;
for(int i=1; i<=N; i++)
{
for(int j=1; j<=M; j++)
{
scanf("%d",&a[i][j]);
dp[i][j]=1;
num[++cnt].val=a[i][j];
num[cnt].x=i;
num[cnt].y=j;
}
}
sort(num+1,num+1+cnt,cmp);
int ans=1;
for(int i=1; i<=cnt; i++)
ans=max(ans,dp[num[i].x][num[i].y]=check(i));
printf("%d\n",ans);
return 0;
}