论记忆化搜索

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

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


相关推荐

  • (一)Rxjava2+Retrofit完美封装

    (一)Rxjava2+Retrofit完美封装本篇文章已授权微信公众号 guolin blog 郭霖 独家发布要说 2016 年最火的 Android 技术是什么 毫无疑问肯定是 RxJava Retrofit Mvp 现如今 2017 年也已经过了快一半了 相信做 android 开发的小伙伴对 RxJava 和 Retrofit 也不再陌生 即使没有刻意的去学习过 也应该对 RxJava 和 Retrofit 有个一知半解 去年的时候学习了 Rxjava 和 Retr

    2025年11月20日
    5
  • hikaripool信息_HikariPool源码(四)资源状态[通俗易懂]

    hikaripool信息_HikariPool源码(四)资源状态[通俗易懂]Java极客|作者/铿然一叶这是Java极客的第55篇原创文章1.本章目的了解池资源的状态,以及状态如何变迁,用于池化资源设计参考。2.HikariPool资源核心类回顾HikariPool资源相关的类如下:类说明:类职责HikariPool资源池,客户端资源操作的入口。ConcurrentBag通用的并发包工具。CopyOnWriteArrayList一个列表,用于存储资源,…

    2022年6月23日
    26
  • pycharm如何创建py文件_程序编写入门

    pycharm如何创建py文件_程序编写入门 1、主题  详细介绍如何使用PyCharm创建一个IPythonNotebook(基于Web技术的交互式计算文档格式)并运行。  2、准备工作  (1)已经创建一个工程,这里使用C:/SampleProjects/py/IPythonNotebookExample目录下的工程。  (2)在设置对话框的ProjectInterpreterpage页面中,    创建一个虚…

    2022年8月29日
    8
  • 解决cron不执行的问题

    解决cron不执行的问题

    2021年11月9日
    52
  • 未来计算机硬件发展趋势是什么,未来计算机硬件发展趋势

    未来计算机硬件发展趋势是什么,未来计算机硬件发展趋势未来计算机硬件发展趋势自从 1946 年著名电脑 ENIAC 以来 电脑硬件一直在高速发展 CPU 频率从最早的 12MHz 当后来 586 电脑使用的 166MHz 奔腾处理器 到现在的 3GHz 20 年间 CPU 频率增长了 250 倍 著名的摩尔定律指出 电脑芯片没 18 个月晶体管数量提升一倍 而价格将降低一倍 相信大部分玩家在两年之前都没有想到可以用上 6 核心的处理器 可以用电脑玩 3D 立体游戏 那么未来的电脑硬件会是什么

    2026年3月18日
    2
  • css自定义横向滚动条样式,css滚动条样式自定义

    css自定义横向滚动条样式,css滚动条样式自定义很简单的几行代码 Title margin 0 padding 0 out width 600px height 600px margin 100pxauto overflow y auto 滚动条整体样式 高宽分别对应横竖滚动条的尺寸 out webkit scrollbar width 5px height 5px 滚动条里面小方块

    2026年3月26日
    3

发表回复

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

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