洛谷P1434 [SHOI2002]滑雪 记忆化搜索

注意:本题求的是最长的滑坡长度,而不是高度

用ans[x][y]表示从(x,y)这一点开始的最长滑坡

那么只要上下左右四个方向的高度比这一点的高度小,ans[x][y]就等于ans[x-1][y]或ans[x+1][y]或ans[x][y+1]或ans[x][y-1]加一,再从这几个值里选择一个最大的就行了

#include<iostream>
using namespace std;
int r,c;//r是行,c是列 
int a[105][105],ans[105][105];//ans[i][j]储存i,j位置可到达的最大长度 
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//下,右,上,左四个方向 
int res(int x,int y)//求(x,y)位置开始的最长滑坡 
{
    if(ans[x][y]>0)return ans[x][y];
    int i,maxx=0;
    for(i=0;i<=3;i++)//枚举4个方向 
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&a[x][y]>a[nx][ny])//没有越界并且高度低于(x,y)的高度 
        {
            int t=res(nx,ny)+1;//长度加1 
            maxx=max(t,maxx);
        }
    }
    ans[x][y]=maxx;
    return maxx;
}
int main()
{
    cin>>r>>c;
    int i,j;
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            cin>>a[i][j];//输入每一点的高度 
    int maxx=0;
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            maxx=max(maxx,res(i,j));//枚举所有位置开始的长度,找到最大的 
    cout<<maxx+1<<endl; 
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/9953232.html