zoukankan      html  css  js  c++  java
  • 记忆化搜索之滑雪问题

    题目链接;

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=10

    题目大意:就是给你一个矩阵,每一次只能往四个方向移动,并且下一步到达的方块上的数值都必须必上一次的小,问你怎样走才能走的步数最多。

    具体思路:就是使用dfs,我觉得记忆化搜索和搜索的不同就是,记忆化搜索已经走过的值直接返回就可以了,不需要再进行计算。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn  105

    int a[105][105];
    int dp[105][105];
    int n,m;
    int w[2][4]= {{1,-1,0,0},{0,0,1,-1}};
    bool judge(int s1,int s2)
    {
        if(s1>=1&&s1<=n&&s2>=1&&s2<=m)
            return true;
        return false;
    }
    int f(int t1,int t2)
    {
        if(dp[t1][t2])
            return dp[t1][t2];//如果已经访问过,就退出来
        for(int i=0; i<4; i++)
        {
            int  xx=t1+w[0][i];
            int  yy=t2+w[1][i];
            if(judge(xx,yy))
            {
                if(a[t1][t2]>a[xx][yy])
                {
                    int temp=f(xx,yy);
                    dp[t1][t2]=dp[t1][t2]>temp?dp[t1][t2]:temp+1;//坑点,一定要注意大小关系,还有相等的时候。
                }
            }
        }
        return dp[t1][t2];
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>n>>m;
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                {
                    cin>>a[i][j];
                }
            }
            memset(dp,0,sizeof(dp));
            int ans=0;
            for(int i=1; i<=n; i++)//从多个起点开始走,不能只是从一个
            {
                for(int j=1; j<=m; j++)
                {
                    ans=max(ans,f(i,j));
                }
            }
            cout<<ans+1<<endl;//加上本身
        }
        return 0;
    }
     

  • 相关阅读:
    web高级第一节
    Socket网络编程
    redis第三节
    redis第二节
    Git(2)
    Xamarin.Android 应用程序配置
    Android--ListView与数据绑定(Xamarin)
    Android--Activity(活动)
    Xamarin Android 真机调试时闪退
    wpf 将Style应用到 ListView 中的 ListViewItem 元素
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262992.html
Copyright © 2011-2022 走看看