记忆化搜索+DP
一直X到最低点的最长路径,切Y>X,则Y到最低点的最短路径就是Y->X+X到最低点的距离
#include <iostream>
#include <stdio.h>#include <string.h>
using namespace std;
#define maxn 200 + 5
int map[maxn][maxn];
int dp[maxn][maxn];
int x[4] = {1,-1,0,0};
int y[4] = {0,0,1,-1};
int R,C;
int dfs( int r, int c)
{
int len = 1;
if(dp[r][c] > 1)
return dp[r][c];
for( int i = 0; i < 4; i++)
{
int row = r + x[i];
int col = c + y[i];
if( row >= 1 && row <= R && col >= 1 && col <= C && map[r][c] > map[row][col])
{
dp[r][c] = dfs(row,col) + 1;
回溯;
if( len < dp[r][c])
len = dp[r][c];
}
}
dp[r][c] = len;
return len;
}
int main()
{
int i,j;
int ans;
scanf("%d %d", &R, &C);
ans = 1;
for( i = 1; i<= R ; i++)
for( j = 1; j<= C; j++)
{
scanf("%d",&map[i][j]);
dp[i][j] = 1;
}
for( i = 1; i<=R; i++)
for( j = 1; j<=C; j++)
{
dp[i][j] = dfs(i,j);
if(dp[i][j] > ans)
ans = dp[i][j];
}
printf("%d\n",ans);
}