P1434 [SHOI2002]滑雪【记搜】

洛谷 P1434 -> Click Here

题意

一个二位矩阵,在一个点可向上下左右移动,如果目标点的高度严格小于当前点的高度,问做多可以移动多少次

思路

记搜入门题

相当于求二维的最长下降数列,使用记忆化搜索,记 $f[y][x] $​ 为从点 \((y,x)\)​ 出发最大的移动次数, \(A[y][x]\)​ 为点 \((y,x)\)​​​ 的高度,递归每一个点,得出最大值

code

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int A[105][105];
int f[105][105];
int vis[105][105];
int uy[]={0,1,0,-1};
int ux[]={1,0,-1,0};
bool pan(int y,int x){
	if(y>=1&&y<=n&&x>=1&&x<=m) return true;
	return false;
}
int ans;
int go(int y,int x){
	if(vis[y][x]==1) return f[y][x];
	vis[y][x]=1;
	f[y][x]=1;
	for(int i=0;i<4;i++)
		if(pan(y+uy[i],x+ux[i])&&A[y][x]>A[y+uy[i]][x+ux[i]])
			f[y][x]=max(f[y][x],1+go(y+uy[i],x+ux[i]));
	return f[y][x];
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&A[i][j]);
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			ans=max(ans,go(i,j));
	printf("%d\n",ans);
	return 0;
}
posted @ 2021-08-07 09:58  莳曳  阅读(30)  评论(0)    收藏  举报