DP+dfs
dp[i][j]:表示从坐标i,j为起始点的最长下降路径。搜索每一条路径取最值。
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
int map[150][150];
int R, C;
int dp[150][150];
int dfs(int i, int j) {
if(dp[i][j] != 0)
return dp[i][j];
int max = 1;
if(i-1 >0 && map[i][j] >map[i-1][j]) {
int len = dfs(i-1, j) + 1;
if(len > max)
max =len;
}
if(j-1 >0 && map[i][j] >map[i][j-1]) {
int len = dfs(i, j-1) + 1;
if(len > max)
max =len;
}
if(i+1 <=R && map[i][j] >map[i+1][j]) {
int len = dfs(i+1, j) + 1;
if(len > max)
max =len;
}
if(j+1 <=C && map[i][j] >map[i][j+1]) {
int len = dfs(i, j+1) + 1;
if(len > max)
max =len;
}
return dp[i][j] =max;
}
int main() {
cin>> R >>C;
for(int i = 1; i<= R; i++) {
for(int j = 1; j <= C; j++){
cin>> map[i][j];
}
}
int max = 0;
memset(dp, 0,sizeof(dp));
for(int i = 1; i<= R; i++) {
for(int j = 1; j <= C; j++){
dp[i][j] =dfs(i, j);
if(max< dp[i][j]) {
max = dp[i][j];
}
}
}
cout<< max<< endl;
//system("pause");
return 0;
}