论记忆化搜索

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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题还是挺好的。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 超分辨率的数据增强Python(超分辨率重建是什么)

    python在图像超分辨率重建中的应用洪华秀[1];【期刊名称】《计算机产品与流通》【年(卷),期】2019(000)002【摘要】图像超分辨率重建技术是低分辨率图像经过一系列算法处理后转换成高分辨率图像的过程,随着图像数据的应用领域不断延伸,这一技术也逐渐成了图像处理研究热点之一。近几年Python语言在人工智能领域逐渐占领榜首,它的优越性在于强大的第三方数据处理工具的支持。本文在图像超分辨率重…

  • 一批SP名单_SP公司

    一批SP名单_SP公司一批SP名单: 端口号(服务号)SP公司名01007广东嘉讯

  • javascript性能优化_javascript框架是什么

    javascript性能优化_javascript框架是什么即使是循环中最快的代码,累计迭代上千次也会慢下来。此外,循环体运行时也会带来小性能开销,不仅仅是增加了总体运行时间。减少迭代次数能获得更加显著的性能提升,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff’sDevice)”。Duff’sDevice是一种循环体展开技术,它使得一次迭代中实际执行了多次迭代的操作。一个典型的实现如下:

  • C语言如何计算数组的长度

    C语言如何计算数组的长度(1)借助sizeof()函数:#include&lt;stdio.h&gt;intmain(){ //定义一个整型数组,并进行初始化赋值9个数据:  intarr[]={1,2,3,4,5,6,7,8,9}; intlength=0; //计算数组中数据长度: //所有数据的字节数除以一个数据的字节数即为数据的个数:  length=sizeof(arr)/…

  • idea最新激活码 3月最新注册码

    idea最新激活码 3月最新注册码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • mse pytorch_torch和pytorch

    mse pytorch_torch和pytorch在pytorch中,经常使用nn.MSELoss作为损失函数,例如loss=nn.MSELoss()input=torch.randn(3,5,requires_grad=True)target=torch.randn(3,5)error=loss(input,target)error.backward()这个地方有一个巨坑,就是一定要小心input和target的位置,说的更具…

发表回复

您的电子邮箱地址不会被公开。

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