论记忆化搜索

论记忆化搜索论记忆化搜索什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。用一个公式简单地说:记忆化搜索=搜索的形式+动态规划的思想。以上的定义是抄的,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

论记忆化搜索

什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。用一个公式简单地说:记忆化搜索=搜索的形式+动态规划的思想

以上的定义是抄的,说的非常神奇。一开始啊,我也不理解。因为我是遇到某些题然后百度到的。经过学习,我发现,所谓记忆化搜索说白了就是暴力枚举。只不过略微优雅一点,把算过的,有可能发生重复的部分进行记忆,不要发生重复计算即可。这就是所谓的记忆化搜索,这是我的理解。

在学习它的过程中,人们总要讲到什么是动态规划,讲到普通的搜索。而在看麻省理工学院公开课:计算机科学及编程导论第13集的时候(http://v.163.com/movie/2010/6/8/1/M6TCSIN1U_M6TCT9E81.html),讲的动态规划引言就是一个默记法(记忆化搜索)。

好了说了这么多,我们看题吧:

第一题:HDU 1501(http://acm.hdu.edu.cn/showproblem.php?pid=1501)

/*
 * 此题使用记忆化搜索
 * 事实证明,有的时候你觉得不可能重复的地方
 * 在经过大型扩展之后,会重复的非常厉害!需要自己作出判断
 * 最后在说:所谓记忆化搜索,就是暴力枚举。。。。。
 */
 
#include<stdio.h>
#include<string.h>
 
char s1[1000],s2[1000],s3[1000];
int a[201][201];//记忆化搜索,存储该状态是否检索过
int len1,len2,len3;
 
int dp(int i, int j, int k)
{
    //printf("%d%d %d\n",i,j,k);
    if(a[i][j]!=-1)
        return a[i][j];
    a[i][j] = 0;
    if(k>=len3)
        return 1;
    elseif(i<len1&&j<len2&&s1[i]==s3[k]&&s2[j]==s3[k])
        return a[i][j]= dp(i+1,j,k+1)+dp(i,j+1,k+1);
    elseif(i<len1&&s1[i]==s3[k])
        return a[i][j]= dp(i+1,j,k+1);
    elseif(j<len2&&s2[j]==s3[k])
        return a[i][j]= dp(i,j+1,k+1);
    else
        return a[i][j]= 0;
}
 
int main()
{
    int n;
   while(scanf("%d",&n)!=EOF)
    {
        int i;
       for(i=0;i<n;i++)
        {
           memset(a,-1,sizeof(a));
           scanf("%s%s%s",s1,s2,s3);
            len1 =strlen(s1);
            len2 =strlen(s2);
            len3 =strlen(s3);
           if(dp(0,0,0)>0)
               printf("Data set %d: yes\n",i+1);
            else
               printf("Data set %d: no\n",i+1);
        }
    }
 
}

第二题:UVA10003

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=944

/*
 * 这道题用的记忆化搜索
 * 说白了就是暴力枚举,然后找出最佳结果
 * 找的过程中注意使用默记法而已。。。。。
 * 这道题的原型是《最佳矩阵乘法》
 * 大致过程为每一步寻找一个最佳中位点,然后递归的找
 * 出来的结果是最终结果
 * 核心是dp函数
 */
#include<stdio.h>
#include<string.h>
#define MAX 0x7fffffff
int f[60][60],L,N,ans,c[60];
void input()
{
     scanf("%d",&N);
      int t;
      c[0]=0;
      c[N+1]=L;
      for(inti=1;i<=N;i++)
      {
         scanf("%d",&c[i]);
      }
}
int dp(int i,int j)
{
    if(f[i][j]!=-1)
        return f[i][j];
    else if(i==j-1)
        returnf[i][j]=0;
    else {
        f[i][j]=MAX;
        int t;
        for(intk=i+1;k<j;k++)
        {
          t=dp(i,k)+dp(k,j)+c[j]-c[i];
          if(f[i][j]>t)
             f[i][j]=t;
        }
        return f[i][j];
    }
}
void solve()
{
   memset(f,-1,sizeof(f));
    ans=dp(0,N+1);
}
void output()
{
    printf("Theminimum cutting is %d.\n",ans);
}
int main()
{
   while(scanf("%d",&L)!=EOF && L!=0)
    {
        input();
        solve();
        output();
    }
 
}

其中第二题是百度的答案,我第一次碰到的记忆化搜索题。

实话说,刘汝佳的UVA题还是挺好的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164446.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MDK5搭建ARM9开发环境「建议收藏」

    MDK5搭建ARM9开发环境「建议收藏」在使用MDK5开发ARM9程序时,需要安装ARM9的支持包。链接:http://www2.keil.com/mdk5/legacy安装后即可在DEVICE选项找到我们需要的芯片型号

    2022年6月10日
    38
  • mysql性能分析工具_中大型suv横向测评

    mysql性能分析工具_中大型suv横向测评因为工作的原因,我有机会仔细用过市面上几乎所有的MySQL管理工具,对各家的数据库管理软件的特性有了全面的了解。我大概用了20+款MySQL管理工具,从种挑出10款最棒的写了今天的测评。其中7款免费或有社区免费版,另外3种是付费版。当初,在研究这些工具时,我发现网上那些所谓的测评推荐文章里,几乎没人真用过自己文章中写的软件,都是云测评。当时就想自己把所有软件都用一遍,找机会写一篇深度横向测评文章,帮助选择困难症患者,选到最合适大家当下工作场景的工具,节省时间。本文所写软件.

    2022年8月22日
    3
  • layui 如何去dom_layui 弹出层

    layui 如何去dom_layui 弹出层这是一个可以重要也可以不重要的方法,重要的是,它的权利真的很大,尤其是在模块化加载layer时,你会发现你必须要用到它。它不仅可以配置一些诸如路径、加载的模块,甚至还可以决定整个弹层的默认参数。而说它不重要,是因为多数情况下,你会发现,你似乎不是那么十分需要它。但你真的需要认识一下这位伙计。如果您是采用seajs或者requirejs加载layer,你需要执行该方法来完成初始化的配置。比如:lay…

    2022年6月11日
    34
  • 神经网络–反向传播详细推导过程

    神经网络–反向传播详细推导过程概述以监督学习为例,假设我们有训练样本集  ,那么神经网络算法能够提供一种复杂且非线性的假设模型  ,它具有参数  ,可以以此参数来拟合我们的数据。为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:这个“神经元”是一个以  及截距  为输入值的运算单元,其输出为  ,其中函数  被称为“激活函数”。在本教程中,我们选用sigmoid函…

    2022年5月6日
    56
  • PHP简单留言板代码[通俗易懂]

    PHP简单留言板代码[通俗易懂]&lt;HTML&gt;//留言板主题作者…

    2022年8月30日
    0
  • 画平行线的步骤口诀_长轴的简化画法

    画平行线的步骤口诀_长轴的简化画法平行线的判定方法是初中数学必须要掌握的知识,但有些同学不太熟悉平行线的判定方法,总会出现丢分的现象,我们一起来看一下常用的平行线的判定方法。(1)平行线的定义法在同一平面内,不相交的两条直线叫做平行线。直线a与b平行,则a∥b(2)平行线的传递性如果两条直线都与第三条直线平行,那么这两条直线也互相平行。也就是说:如果b∥a,c∥a,那么b∥c例题:如图,直线a∥b,b∥c,c∥d,那么a∥d吗?…

    2022年9月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号