HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560
BFS题解:http://www.cnblogs.com/crazyapple/p/3218107.html
构造一个串,使得它包含所有的给定DNA序列,并且要求长度最短。
采用dfs策略,对于每个串定义1个指针,当全部指针为串尾时判断构造的长度,由于状态空间过大,但是又存在冗余搜索,可以用迭代加深将状态减少。最长待构造长度 + 当前长度 < 迭代的最大深度则直接return,大大减少了状态数。
慢慢迭代加深搜索;
代码:
#include<iostream>
#include<stdio.h>
#include<string.h> using namespace std; struct Nod
{
int pos[];
}temp;
int n,len[];
char str[][];
char dna[]="ACGT"; int dfs(Nod tnd,int sum,int depth) //迭代加深搜索
{
int i,j,flag;
Nod nd;
if(sum>depth) return ; //搜索深度超过depth时,表示深度depth太小,还得继续增加
for(i=;i<n;i++) if(len[i]-tnd.pos[i]+sum>depth) return ; //某一个串超过深度depth,len[i]是串本身的长度,tnd.pos[i]为迭代产生的长度,sum为迭代的深度
for(i=;i<n;i++) if(tnd.pos[i]<len[i]) break; //如果某行没有迭代到本身串的长度就break,结合下面if(i==n)判断
if(i==n) return ; //如果i==n,即对i(0,n-1) tnd.pos[i]>=len[i],全部迭代完成
for(i=;i<;i++)
{
flag = ; //标记是否匹配上
for(j=;j<n;j++)
{
if(str[j][tnd.pos[j]]==dna[i]) //用A C G T去匹配
{
flag = ;
nd.pos[j] = tnd.pos[j] + ; //匹配上了位置向后移动一位
}
else
{
nd.pos[j] = tnd.pos[j];
}
}
if(flag&&dfs(nd,sum+,depth)) return ; //匹配上了,就进行下一层匹配
}
return ;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i;
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%s",str[i]);
len[i] = strlen(str[i]);
}
for(i=;;i++) if(dfs(temp,,i)) break; //i为迭代加深的值,找到则跳出
printf("%d\n",i);
}
return ;
}
HDU 1560 DNA sequence (IDA* 迭代加深 搜索)的更多相关文章
- HDU 1560 DNA sequence (迭代加深搜索)
The twenty-first century is a biology-technology developing century. We know that a gene is made of ...
- HDU 1560 DNA sequence(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题目大意:给出n个字符串,让你找一个字符串使得这n个字符串都是它的子串,求最小长度. 解题思路: ...
- HDU 1560 DNA sequence(DNA序列)
HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 1560 DNA sequence(迭代加深搜索)
DNA sequence Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- hdu 1560 DNA sequence(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others) ...
- HDU 1560 DNA sequence DFS
题意:找到一个最短的串,使得所有给出的串是它的子序列,输出最短的串的长度,然后发现这个串最长是40 分析:从所给串的最长长度开始枚举,然后对于每个长度,暴力深搜,枚举当前位是哪一个字母,注意剪枝 注: ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- HDU - 1560 DNA sequence
给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...
- HDU 1560 DNA sequence A* 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=1560 仔细读题(!),则可发现这道题要求的是一个最短的字符串,该字符串的不连续子序列中包含题目所给的所有字符串 ...
随机推荐
- jsp:session对象存储数据
public void setAttribute(String key,Object obj).session对象可以调用该方法将参数object指定的对象obj添加到session对象中,并为添加的 ...
- Tomcat启动报错 Failed to start component [StandardServer[8005]]解决
SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catal ...
- matrix computing optimization schemes
* stackoverflow: how does BLAS get such extern performance * Howto optimizate GEMM http://wiki.cs.ut ...
- mysql修改主键
先删除所有主键 alter table tableName drop primary key; 然后添加主键 alter table tableName primary key(id);//如果是联合 ...
- [MSDN] 使用 SharePoint 2013 中的 JavaScript 库代码完成基本操作
MSDN:http://msdn.microsoft.com/zh-cn/library/jj163201.aspx 了解如何编写代码以在 SharePoint 2013 中使用 JavaScript ...
- SAX方式解析XML文件实例
books.XML文件: 书籍book.java实体类: public class Book { private String id; private String name; private Str ...
- 怎样向IT行业的朋友说明《圣经》的重要性
“世界的官方文档”——怎么样?
- 隐藏NavigationBar 带来的坑
一.场景介绍 现在大多数APP 都有一个需求,就是隐藏某一个页面的NavigationBar.很多开发者直接 [self.navigationController setNavigationBar ...
- 使用FreeMarker生成静态HTML
1.FreeMarker需要添加的Maven依赖: <dependency> <groupId>org.freemarker</groupId> <artif ...
- About 'atoi'
在很多地方我们看到的都是:atoi 是一个 C Reference function atoi() convert a string to an integer. This function of s ...