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;
}

浙公网安备 33010602011771号