POJ 1088滑雪

滑雪

题目意思很清楚就是找一条连续下降的最长序列,不需要求出序列。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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值