有些像上升子序列的另一个版本。
下降子序列。
当dp函数中的第三个if判断h[a][b] 和 h[x][y]的大小时,不论大小都能ac。
最长的下降序列和最长的上升序列应该本质是一致的。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3e2 + 10;
int h[N][N];
int f[N][N];
int n,m;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int dp(int x, int y){
int &v = f[x][y];
if(v != -1) return v;
v = 1;
for(int i = 0; i < 4; i++){
int a = x + dx[i], b = y + dy[i];
//判断h[a][b]是否越界。
if(a < 0 || a >= n || b < 0 || b >= m) continue;
//发现h[a][b] > h[x][y]同样可以ac。当存在上升最长的时,或许也可以用这个方法。
if(h[a][b] < h[x][y]){//当有四个方向存在一个方向小于x,y时,就可以选择这个方向即(a,b)
v = max(v, dp(a,b) + 1);
}
}
return v;
}
int main(){
memset(f, -1, sizeof(f));
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
scanf("%d",&h[i][j]);
}
}
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
ans = max(ans, dp(i,j));
}
}
printf("%d\n",ans);
return 0;
}