思路
这道题是二维下的最长下降子序列,可以用类似的动态规划解决。用二维数组DP[][],DP[i][j]表示以(i,j)处为止的最长下降序列。先将每个点 m[i][j] 以高度为关键字逆序排序,这样可以保证无后效性,状态转移方程为
其中nx, ny为该点周围四个点之一的坐标。
AC代码
#include<iostream>
#include<algorithm>
using std::cin;
using std::cout;
using std::sort;
typedef struct {
int h, x, y;
}M;
bool cmp(M a, M b){
return a.h < b.h;
}
int main(){
int R, C, len = 0;
int moutain[100][100];
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
M m[10000];
int dp[100][100];
cin>>R>>C;
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
cin>>moutain[i][j];
m[len].h = moutain[i][j];
m[len].x = i;
m[len].y = j;
len++;
}
}
sort(m, m + len, cmp);
dp[m[0].x][m[0].y] = 1;
for(int i = 1; i < len; i++){
dp[m[i].x][m[i].y] = 1;
for(int j = 0; j < 4; j++){
int nx = m[i].x + dir[j][0];
int ny = m[i].y + dir[j][1];
if(nx < 0 || ny < 0 || nx >= R || ny >= C)
continue;
if(moutain[nx][ny] < m[i].h){
dp[m[i].x][m[i].y] = dp[m[i].x][m[i].y] >= dp[nx][ny] + 1 ? dp[m[i].x][m[i].y] : dp[nx][ny] + 1;
}
}
}
int res = 1;
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
if(dp[i][j] > res){
res = dp[i][j];
}
}
}
cout<<res;
return 0;
}