题目意思很清楚就是找一条连续下降的最长序列,不需要求出序列。dp求解,以每个点位终点,那么就有四个方向选择,只需要选出小于当前点的高度且长度最长的就可以了。方程这里就不写了,直接看程序。这里用记忆化的方式会更容易一点。
#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAXN 103
int map[MAXN][MAXN] ;
int dp[MAXN][MAXN] ;
int dir[][2] = {{-1, 0} ,{1 , 0} , {0 , 1} , {0 , -1}} ;
int n ;
int m ;
int dfs(int x , int y){
int &ans = dp[x][y] ;
if(ans > 0)
return ans ;
int xn ;
int yn ;
for(int i = 0 ; i < 4 ; i ++){
xn = x + dir[i][0] ;
yn = y + dir[i][1] ;
if(xn > 0 && xn <= n && yn > 0 && yn <= m){
if(map[xn][yn] < map[x][y] && dfs(xn , yn) > ans){
ans = dfs(xn , yn) + 1 ;
}
}
}
if(ans==0)
ans = 1 ;
return ans ;
}
int main(){
scanf("%d %d" , &n , &m) ;
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= m ; j ++){
scanf("%d" , &map[i][j]) ;
dp[i][j] = 0 ;
}
}
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= m ; j ++){
dfs(i , j) ;
}
}
int nmax = -1 ;
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= m ; j ++){
nmax = nmax > dp[i][j] ? nmax : dp[i][j] ;
}
}
printf("%d" , nmax) ;
return 0 ;
}

255

被折叠的 条评论
为什么被折叠?



