需要一定技巧的搜索题

题目描述

记得做过这样一道题

Ponder This Challenge:
In the string CABACB, each letter appears exactly twice and the number of characters between the "A"s is one, between the "B"s is two, and between the "C"s is three. The same problem with the letters A-E cannot be solved, but adding a space (in the form of a hyphen) allows it to be solved. For example, in the string ADAEC-DBCEB, the number of characters between the "A"s is one, between the "B"s is two, between the "C"s is three (counting the space), between the "D"s is four, and between the "E"s is five. Find a string of letters (A-Z) and "-" whose length is no more than 53 characters, where each of the 26 letters A-Z appears exactly twice, and there is one character between the "A"s, two between the "B"s ... and 26 between the "Z"s.

现在输入 n≤26,你需要输出一个对于前 n 个大写字母的长度不超过 2n+1 的解。

空格(space)用连字符(hyphen) - 表示。

数据规模与约定

共 25 个数据,2≤n≤26

  时间限制:1s

  空间限制:256MB


题目分析

题目大意

构造有前n个大写字母的字符串:字符串需要满足'A'和'A'之间有一个字符,'B'和'B'之间有两个字符……字符串之中最多允许有一个空格。

NPC

显然这是一道NPC问题,那么考虑怎么搜索。

搜索一  暴力的暴力搜索

我们使用一个2*n+1长度的a[]数组保存这个字符串;n+1大小的vis[]数组检验第i个字符使用了几次。

接下去DFS每一个位置、枚举每一个可以使用的字符。直到我们dfs完了所有字符,再从头检查这个字符是不是合法的。

这种原始方法已经是枚举所有的方案数了,速度可想而知。

1s跑出的答案:2-5个

优化一  每次投放两个字符

既然合法的充要条件是两个第i个字母之间相隔i个字符,为什么不在DFS时候这样处理呢?

1s跑出的答案:2-13个

优化二  倒着枚举投放字符

由于题目的特殊性质,显然可以发现:如果正着枚举,很容易出现字符之间已经挤得满满当当,却检验不合法,因此此后必须搜索很多无用的状态。

因此我们倒着来。这样可以使每一对已确定下来的字符之间有大量间隔,这样能够更快速地搜索出可行解。

1s跑出的答案:2-16个

搜索二  换个角度dfs

即便使用了以上两个优化、即便你卡常技巧再高超,抱歉搜索到n=20左右效率又奇低无比了。

实际上,搜索一所面对的dfs对象决定了效率的低下。这和dp其实很相像,看似差之毫厘的dp方程在效率上却有很大的差别。

考虑一下dfs每一个字母,枚举它可以存在的位置

从写法上看,它要简洁很多。

从效率上看,它的状态数也大大减少。

只考虑所有状态的话大致是上面的这两个表达式。大概就是以下这样的图像。

并且当n增大时,两者的差别还是非常明显的。

有时候我很奇怪,为什么在动态规划和搜索中,这样的看上去微不足道的改动却足以造成这样大的差别。或许问题归根结底还要靠数学分析,也或许这一方面的一些感觉需要大量的做题积累,不过这倒是一种很好的思路方向。

真的挺不错的一种思路方向。

END

【搜索 技巧】Letter gaps的更多相关文章

  1. Google Hack搜索技巧

    想了解更多搜索技巧,点击下面网站了解http://exploit-db.com/google-dorks Google Hack的一些整理 这里是google关键字的用法,要设置它为中文,则是 htt ...

  2. 搜索技巧<转>

    平时工作,搜索引擎是少不了的,作为程序员,当然首推 Google.这里简单介绍下几个 Google 搜索的小技巧,方便别人也方便自己查阅. ps:以下所有操作,均可以在 「谷歌搜索首页 -> 设 ...

  3. Google和Baidu常用的搜索技巧--转

    原文链接:http://mp.weixin.qq.com/s?__biz=MjM5NTY0MTY1OQ==&mid=2654509772&idx=1&sn=754454e374 ...

  4. 技术|程序员必须要学会Google搜索技巧

    程序员必须要学会Google搜索技巧 摘要: 因为Google在我天朝被墙,学FQ请通过Bing进行搜索如何FQGoogle搜索技巧我曾经多次劝我的另一个朋友花10分钟学习一下Google通配符的使用 ...

  5. google搜索技巧汇总

    由于不能访问google,可访问ggso.in进行搜索. 简单整理记录一下常用的一些Google搜索技巧:或操作一般搜索时,如果输入多个词,默认是与的关系,如输入词1和词2,即搜索同时包含词1和词2的 ...

  6. 如何使用GOOGLE高级搜索技巧

    如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...

  7. Github搜索技巧-如何使用github找到自己感兴趣的项目

    Github现在不仅仅作为一个版本控制工具,更是一个开源的仓库,里面不但有优秀的开源代码,电子书,还有一些五花八门的项目,有些国家的法律也放在上面,作为程序员如何找到自己感兴趣的项目就非常重要了! 欢 ...

  8. 五个对你有用的Everything搜索技巧

    分享五个对你有用的Everything搜索技巧: 一, empty:(查找空文件夹);二, dupe:(查重复文档);三, 空格(与), |(或),!(非); 四, e:\ (路径搜索);五, wil ...

  9. 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力

    可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...

  10. GOOGLE高级搜索技巧

    前记:  我是完整的看完了.内容有点乱啊,自己没有时间整理,先放在自己的印象笔记里了....   二,GOOGLE特色 GOOGLE支持多达132种语言,包括简体中文和繁体中文: GOOGLE网站只提 ...

随机推荐

  1. js框架:jQuery

    · jQuery是一个轻量级的“写的少,做的多”的JavaScript函数库(jQuery版本2以上不支持IE6,7,8) · jQuery 的功能概括: 1.html 的元素选取 2.html的元素 ...

  2. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  3. MyBais中xxMap.xml中的知识点

    添加新的mapper的时候下面两个标红的地方要注意,如果统一约定好命名的话都还好,但是就怕一会这样一会那样的业务代码:总之小心! <!-- spring与mybatis整合配置,扫描所有dao, ...

  4. 002-tomcat安装与配置

    1.创建目录 [root@bogon tomcat]#mkdir /usr/local/java/tomcat 2.上传压缩包并解压 [root@bogon tomcat]# tar xvf apac ...

  5. 如何用dos命令结束进程

    ntsd 是一条dos命令,功能是用于结束一些常规下结束不了的死进程. 用法为打开cmd 后输入以下命令就可以结束进程: 方法一:利用进程的PID结束进程 命令格式:ntsd -c q -p pid ...

  6. [题解](背包)luogu_P4095 eden的新背包问题

    有一点乱搞吧......对人对背包的理解有些考验,要想知道去掉某个点的值,可以选择对前缀求一次背包,后缀求一次背包,而且不省掉价钱那一维, 这样每个点就可以由前后组合成了,枚举一下价钱取max即可 直 ...

  7. IIS7文件无法下载问题处理

    使用IIS建立了静态站点,内部放置了一些文件供内部局域网下载使用,但deb等文件格式无法下载. 解决办法: 1.在IIS管理器中点击站点,选择右侧的MIME类型. 2.在MIME类型中添加需要下载文件 ...

  8. 进程---Process

    #! /usr/bin/env python# -*- coding:utf-8 -*- """ python中的多线程其实并不是真正的多线程(全局解释器锁(GIL)存在 ...

  9. 使用em和rem替代px

    rem是指根元素的字体大小,默认情况下html的字体大小为:16px=1rem.而em是相对单位,是基于它的祖先元素计算的. 如果我们不指定html和body的字体大小,要得到12px的rem需要这样 ...

  10. Crusher Django 学习笔记2 基本url配置

    http://crusher-milling.blogspot.com/2013/09/crusher-django-tutorial2-conf-basic-url.html 顺便学习一下FQ Cr ...