题目链接:[SHOI2002] 滑雪 - 洛谷
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct point
{
int x,y;
int high;
bool operator<(point const a)const{
return high<a.high;
}
};
int main()
{
int n,m;
int cnt=0;
point p[10500];
int map[102][102]={0};
int high[102][102]={0};
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int ans=0;
cin>>n>>m;
for(int i=0;i<101;++i)
{
for(int j=0;j<101;j++)
{
map[i][j]=1;
}
}
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
cin>>p[cnt].high;
p[cnt].x=i+1;
p[cnt].y=j+1;
high[i+1][j+1]=p[cnt++].high;
}
}
sort(p,p+m*n);
for(int i=0;i<m*n;++i)
{
for(int j=0;j<4;++j)
{
if(high[p[i].x+dir[j][0]][p[i].y+dir[j][1]]>high[p[i].x][p[i].y])
map[p[i].x+dir[j][0]][p[i].y+dir[j][1]]=max(map[p[i].x+dir[j][0]][p[i].y+dir[j][1]],map[p[i].x][p[i].y]+1);
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
ans=max(ans,map[i][j]);
}
}
cout<<ans<<endl;
return 0;
}