写了有段时间搜索题目,但是第一次碰到迭代深搜。

这是题目链接

题目的意思大概就是给你几个字符串让后让你求包含所有这几个字符串的最短字符串。不要求连续只要相对位置不变就可以

这道题我没有用广搜写过,好像是会MLT。

思路就是对照着“ACGT”,不一定要这个只要包含这四个字母的序列,用一个q数组存每一个字符串当前还没放进去的第一位的位置

然后依次拿输入中的几个字符串的第一位没有被放进去的字符去匹配,如果相同就让搜索深度加一,并且当前字符串的q++.直到深度超过当前规定的最大深度或者所有字符串的q都已经等于字符串的长度;

ida的特点就是先规定一个深度,如果超过了这个深度还没找到答案就让这个最大深度加一然后再搜。这样就避免了这道题里一直往下搜搜一些完全不必要的点。

还有两种剪枝。我认为这个博客剪枝讲的很清楚

http://blog.csdn.net/flyawayl/article/details/55667822

以下是自己写的代码,剪枝部分是学习上面这个博客的代码的

代码的最后给了两个测试数据,看看就好,是我自己乱打的。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
int deepmax;
int ans;
int n;
int tp[4], coast[4];
map<char, int> ha;
string sub = "ACGT";
string s[10];int cal(int pos[])
{memset(tp, 0, sizeof(tp));memset(coast, 0, sizeof(coast));int ans = 0;for(int i = 0; i < n; ++i)      //遍历每一个字符串{for(int j = pos[i]; j < s[i].length(); ++j)++tp[ha[s[i][j]]];  //记录第i个字符串中各种字符的数量for(int j = 0; j < 4; ++j){coast[j] = max(coast[j], tp[j]);        //记录每种sub中的字符在每个字符串中出现的次数的最大的一个次数tp[j] = 0;      //初始化}}for(int j = 0; j < 4; ++j)ans += coast[j];      //计算出最少还要多深的层数return ans;
}bool DFS(int index, int len[])
{int maxx = -1;maxx = cal(len);if(maxx == 0)       //如果最少只需要0说明已经搜到了{ans = index;cout << ans<<endl;return true;}if(index + maxx > deepmax)return false;  //如果预计的最少深度都超出的话就可以退出了int pos[10] = {0};          //初始化for(int i = 0; i < n; ++i){pos[i] = len[i];}int flag = false;for(int i = 0; i < 4; ++i){for(int j = 0; j < n; ++j){if(sub[i] == s[j][pos[j]])      //如果当前字符串有和sub[i]相同的就让当前字符串的pos++;{++pos[j];flag = true;}}if(flag && DFS(index + 1, pos)) //如果没有相同的就不要往下搜了,这个flag不判断貌似也能ac,不知道到底有没有用,看所有网上的代码都有这个条{return true;}else{for(int j = 0; j < n; ++j){pos[j] = len[j];        //还原}}}return false;
}int main()
{for(int i = 0; i < 4; ++i){ha[sub[i]] = i;             //剪枝的时候统计当前字符串里有几个sub[i]用的}int t;cin >>t;int pos[10];        //记录第i个字符串已经放进了几个字符while(t--){deepmax = -1;     //规定最大搜索深度memset(pos, 0, sizeof(pos));cin >>  n;for(int i = 0; i < n; ++i){cin >>s[i];if(deepmax < s[i].length())deepmax = s[i].length();  //找最长的字符串作为初始最大搜索深度}while(1){ans = -1;           //标记是否找到DFS(0, pos);if(ans != -1)break;      //其实我这里如果dfs返回bool类型的话我可以直接用dfs的返回值判断是否已经搜到了答案。++deepmax;      //没有找到就让最大搜索深度加一//cout <<'D'<<deepmax<<endl;}}return 0;
}
/*
66
5
ACGT
TACG
TGCA
AAAA
CGAG
6
AACG
GCAT
TAGC
GCTT
ACGT
ACAC8
AAAAA
CCCCC
TTTTT
GGGGG
CACAC
AGGGA
TTTTT
GAGGA101020
*/

DNA sequence HDU 1560相关推荐

  1. HDU 1560 DNA sequence(DNA序列)

    HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K  ...

  2. Recursive sequence HDU - 5950

    Recursive sequence HDU - 5950 题意: 给你一个式子:f[n]=2f[n-2]+f[n-1]+n4 给你f[1]和f[2],给你一个n,求f[n] f[1],f[2],n& ...

  3. E - DNA Sequence POJ - 2778

    It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...

  4. 【POJ No. 2778】DNA 序列 DNA Sequence

    [POJ No. 2778]DNA 序列 DNA Sequence 北大OJ 题目地址 [题意] DNA序列是一个只包含A.C.T和G的序列.分析DNA序列片段非常有用,若动物的DNA序列包含片段AT ...

  5. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  6. HDU - 1560 DNA sequence

    给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...

  7. hud 1560 DNA sequence(IDA* 迭代加深搜索+估值函数)

    传送门 题目: Problem Description The twenty-first century is a biology-technology developing century. We ...

  8. HDU 1560 sequence

    题目链接 Problem Description The twenty-first century is a biology-technology developing century. We kno ...

  9. BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目意思:给出 一个从1~N 的排列你和指定这个排列中的一个中位数m,从这个排列中找出长度为奇数 ...

最新文章

  1. 字符编码简介 ANSI Unicode Unicode big endian UTF-8
  2. 【ZZ】IPv4与IPv6
  3. 计算机网络中对等层,【计算机网络】两个网络模型——OSI参考模型和TCP/IP模型...
  4. MySQL5.7升级到8.0 之后,配合ubantu18.04遇到的常规问题以及非常规问题的解决方案
  5. app获取个人信息是否合法_重拳出击!42款APP过度收集用户信息被点名
  6. 很容易学习的JQuery库 : (八) 杂项 noConflict() 方法
  7. 两个整数集合的交集 ———— 腾讯2014软件开发笔试题目
  8. 使用函数式编程方式-递归
  9. 【Proteus仿真8086】并行接口芯片8255
  10. P2P网络借贷系统-核心功能-用户投标-业务解说
  11. 权限数据库设计(Sql Server)
  12. Activemq 下载地址
  13. 通达信股票软件日线数据分析
  14. linux 硬盘自动休眠,【Linux】硬盘休眠
  15. 在QQ浏览器打开html,QQ浏览器显示网页打开错误的解决方法
  16. win10系统崩溃怎么修复
  17. Steam推出多人联机本地游戏功能 即将推出
  18. 前端使用pdf.js插件在线浏览pdf
  19. 集成产品开发,不让你的产品变现脚踩西瓜皮
  20. SecureCRT的安装及破解(详细过程)

热门文章

  1. 怎么windows设置qq邮箱服务器,电脑中如何添加QQ邮箱到Windows Live Mail
  2. 史上最详细的新浪广告系统技术架构优化历程
  3. php 调用系统时间往前调,PHP中关于系统时间和输出差距8小时的原因及解决方案...
  4. Samara SAU ACM ICPC Quarterfinal Qualification Contest 2012
  5. 【linux C】基础
  6. 阿里撤退百度放弃,应用商店十年神话终落幕
  7. oracle远程不能访问权限,oracle限制远程访问
  8. 连通块(信息学奥赛一本通 - T1335)
  9. 2022年3000元电脑最强组装 组装电脑配置推荐3000元左右
  10. .NET破解之太乐地图下载器【非暴破】