zoukankan      html  css  js  c++  java
  • [DFS] [记忆化] [洛谷] P1434 [SHOI2002]滑雪

    这个题求连续下降距离

    第一个想法肯定是DFS

    接着想一下

    可能会出现向下深搜的过程中搜到已经搜过的点

    所以再记忆化以下

    #include <iostream>
    using namespace std;
    
    typedef long long ll;
    
    const int MAXN = 1e3 + 10;
    
    int arr[MAXN][MAXN] = {0}, dp[MAXN][MAXN] = {0};
    
    int N, M;
    
    int dfs(int x, int y)
    {
        if(dp[x][y] == 0)
        {
            dp[x][y] = 1;
            
            if(x + 1 < N && arr[x + 1][y] < arr[x][y])
            {
                dp[x][y] = max(dp[x][y], dfs(x + 1,y) + 1);
            }
        
            if(x - 1 >= 0 && arr[x - 1][y] < arr[x][y])
            {
                dp[x][y] = max(dp[x][y], dfs(x - 1,y) + 1);
            }
        
            if(y + 1 < M && arr[x][y + 1] < arr[x][y])
            {
                dp[x][y] = max(dp[x][y], dfs(x,y + 1) + 1);
            }
        
            if(y - 1 >= 0 && arr[x][y - 1] < arr[x][y])
            {
                dp[x][y] = max(dp[x][y], dfs(x,y - 1) + 1);
            }
        }
        return dp[x][y];
    }
    
    int main()
    {
        cin>>N>>M;
    
        int rans = 0;
    
        for(int i = 0; i < N; i++)
            for(int j = 0; j < M; j++)
                cin>>arr[i][j];
    
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < M; j++)
            {
                dfs(i, j);
            }
        }
    
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < M; j++)
            {
                //cout<<dp[i][j]<<' ';
                rans = max(rans, dp[i][j]);
            }
            //cout<<endl;
        }
    
        cout<<rans<<endl;
    
        return 0;
    }
  • 相关阅读:
    JMeter学习(二十三)关联
    最常用的DOS命令
    不同类型的操作系统
    分级存储管理的四大优点
    软件工程中数据库设计
    PPP(点对点协议(Point to Point Protocol)
    关键路径法
    什么是鲁棒性测试
    何为蠕虫病毒
    临界区
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270572.html
Copyright © 2011-2022 走看看