感觉没啥技巧,中文题开始都看错了,以为 25-1的距离就是25,现在感觉很不在状态啊, 加油,调整状态。
首先,这题拿到了就感觉得先把结点按照高度(升序)来进行排序,然后在从低高度向高高度前进,这题另外需要注意的就是集中存储结构相互结合,别人怎么做的我不知道,我自己的必须得找出 x,y处高度在前面排序中的rank。
来看代码吧。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 10010
using namespace std;
typedef struct{
int x,y,h;
}Node;
Node a[N];
int di[4][2] = {1,0,-1,0,0,1,0,-1};
bool cmp(Node a,Node b)
{
return a.h<b.h;
}
int n,m;
int dp[N];
int map[101][101];//存储原图
int rank[101][101];//原图中x,y的rank
int main()
{
cin >> n >> m;//行和列
int p = 0;
for(int i=1; i<=n; ++i)
for(int e=1; e<=m; ++e)
{
cin >> a[++p].h;
map[i][e] = a[p].h;
a[p].x = i; a[p].y = e;
}
sort(a+1, a+n*m+1, cmp);
for(int i=1; i<=n*m; ++i)
dp[i] = 1;
for(int i=1; i<=n*m; ++i)
{
rank[a[i].x][a[i].y] = i;
}
for(int i=1; i<=n*m; ++i)//主要DP的位置,就是按照其高度进行遍历
{
int kk,ff;
for(int e=0; e<4; ++e)
{
kk = a[i].x + di[e][0]; ff = a[i].y + di[e][1];
if(0<kk&&kk<=n&&ff>0&&ff<=m&&map[kk][ff] < a[i].h&&dp[i] < dp[rank[kk][ff]]+1)
dp[i] = dp[rank[kk][ff]] + 1;
}
}
int ma = 0;
for(int i=1; i<=n*m; ++i)
if(ma < dp[i])
ma = dp[i];
cout << ma <<endl;
return 0;
}