论记忆化搜索

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

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


相关推荐

  • 高级C/C++编译技术之读书笔记(五)之动态库版本控制

    本节思维导图1.主次版本号与向后兼容性并不是所有代码改动都会对模块的功能产生影响,有些改动只是对原有代码进行一些细微的改进或错误修正,而其它一些改动则会修改原有的功能实现,在复杂的版本控制策略中

    2021年12月28日
  • 关于苹果审核反馈的17.2

    关于苹果审核反馈的17.2

  • SpringBoot调用.asmx后缀的webservice接口

    SpringBoot调用.asmx后缀的webservice接口目录一、简介二、示例一、简介最近在项目中,在与其他公司做对接中需要回调一个对方的接口,根据对方提供的接口地址,发现是webservice的接口,而且接口后缀名为.asmx,因为现在webservice接口基本上都是wsdl这种形式,所以使用wsdl调用方式不能用,得使用其他方法。WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。其实WebService.

  • Python字符串转换为日期时间– strptime()「建议收藏」

    Python字符串转换为日期时间– strptime()「建议收藏」Wecanconvertastringtodatetimeusingstrptime()function.Thisfunctionisavailableindatetimeandtimemodulestoparseastringtodatetimeandtimeobjectsrespectively.我们可以使用strptime()函数将字…

  • JDBC_5 DBUtils[通俗易懂]

    JDBC_5 DBUtils[通俗易懂]DBUtilscommons-dbutils是Apache组织提供的一个开源JDBC工具类库,封装了针对于数据库的增删改查操作APIQueryRunnerResulSetHandlerDbutils插入举例Connection conn = null; try { QueryRunner runner = new QueryRunner(); conn = JBBCUtils.getConnections3();

  • 智能网关是路由器吗_一般路由器网关是多少

    智能网关是路由器吗_一般路由器网关是多少配制成路由网关filters作用是让页面请求地址变成自己设置的地址现在页面出现了400错误因为之前的renrne-fast里面自己配置了跨域等于配置了二个跨域所以我们配置跨域的时候要把他的注释掉addallowOriginPattern这个注解…

发表回复

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

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