HDU 1560 DNA sequence A* 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=1560
仔细读题(!),则可发现这道题要求的是一个最短的字符串,该字符串的不连续子序列中包含题目所给的所有字符串
因为总共只有40个字符,可以尝试使用A*搜索
1.存储状态时直接存储40个字符,每个字符4种可能是肯定不行的.
因为要求的是包含不连续的子序列,所以只需记住当前字符串长度与每个子序列已经包含在当前字符串的长度,
比如题目中的输入样例
4
ACGT
ATGC
CGTT
CAGT
可以这样存储一个序列
ATG:len=3,s[0]=1,s[1]=3,s[2]=0,s[3]=0,
ATC:len=3,s[0]=2,a[1]=2,s[2]=1,s[3]=1,
又因为只有8个子序列,每个子序列长度不超过5,也就是说可以采用6进制来压缩状态数组.总共不超过6^9=10077696种状态,空间时间都满足
2.评估函数随便选取了当前未实现的最长长度,2483ms过关
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxsta=10077696;
char str[8][6];
int l[8];
int grade[8][6];
bool vis[maxsta];
int s[8];
int n;
struct status{
int len,f;
int sta;
status():len(0),f(0),sta(0){}
status(int _len,int _f,int _sta):\
len(_len),f(_f),sta(_sta){}
bool operator <(status s2)const {
if(s2.len!=len)return len>s2.len;
return f>s2.f;
}
void tos(){
int tsta=sta;
for(int i=n-1;i>=0;i--){
s[i]=sta%6;
sta/=6;
}
sta=tsta;
}
static int tosta(){
int sta=0;
for(int i=0;i<n;i++){
sta*=6;
sta+=s[i];
}
return sta;
}
static int calcf(int sta){
int tmp[8];
int ans=0;
for(int i=n-1;i>=0;i--){
tmp[i]=sta%6;
sta/=6;
ans=max(ans,l[i]-tmp[i]);
}
return ans;
}
};
priority_queue<status> que;
int ed;
int bfs(){
while(!que.empty())que.pop();
status st=status(0,status::calcf(0),0);
char ch[4]={'A','G','C','T'};
que.push(st);
vis[0]=true;
while(!que.empty()){
status tp=que.top();que.pop();
if(tp.sta==ed)return tp.len;
for(int i=0;i<4;i++){
tp.tos();
for(int j=0;j<n;j++){
if(ch[i]==str[j][s[j]]){
s[j]++;
}
}
int tmpsta=status::tosta();
if(vis[tmpsta])continue;
vis[tmpsta]=true;
if(tmpsta==ed)return tp.len+1;
que.push(status(tp.len+1,status::calcf(tmpsta),tmpsta)); } }
return -1;
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%s",str[i]);
l[i]=strlen(str[i]);
s[i]=l[i];
}
ed=status::tosta();
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}
HDU 1560 DNA sequence A* 难度:1的更多相关文章
- 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(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others) ...
- hdu 1560 DNA sequence(迭代加深搜索)
DNA sequence Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- HDU 1560 DNA sequence(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题目大意:给出n个字符串,让你找一个字符串使得这n个字符串都是它的子串,求最小长度. 解题思路: ...
- 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
给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...
- HDU 1560 DNA sequence DFS
题意:找到一个最短的串,使得所有给出的串是它的子序列,输出最短的串的长度,然后发现这个串最长是40 分析:从所给串的最长长度开始枚举,然后对于每个长度,暴力深搜,枚举当前位是哪一个字母,注意剪枝 注: ...
- POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...
随机推荐
- Python学习笔记15—mysql的操作
安装 Python-MySQLdb pip install mysql-Python Python对mysql的操作 建立一个实验数据库demo mysql> create database d ...
- spring data jpa 创建方法名进行简单查询
版权声明:本文为博主原创文章,未经博主允许不得转载. spring data jpa 可以通过在接口中按照规定语法创建一个方法进行查询,spring data jpa 基础接口中,如CrudRepos ...
- hdu5823(反演dp)
听说3^n也能水过去.. 其实应该是个经典题,求图染色这个np问题. 把问题拆成独立集来进行dp可以在3^n之内水过去. 拆成独立集的时候就发现,等价与一个经典的反演dp问题 然后复杂度就变成了 n* ...
- Bootstrap列表
一.HTML的列表 在HTML文档中,列表结构主要有三种:有序列表.无序列表和定义列表.具体使用的标签说明如下: 1.无序列表 <ul> <li>…</li> &l ...
- 线程池的原理及实现 (zhuan)
http://blog.csdn.net/hsuxu/article/details/8985931 ************************************************* ...
- PHP获取某年第几周的开始日期和结束日期
http://blog.csdn.net/qq_27080247/article/details/50835956 /** * 获取某年第几周的开始日期和结束日期 * @param int $year ...
- centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误
centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误 之前把selinux关闭了,这次想打开selinux,于是修改了 /e ...
- 在centos6.5中安装reids
一.简介 Redis是一个key-value存储系统,是一个内存数据库,Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作 ...
- robotframework笔记16
发布处理具有相同名称的关键字 使用机器人框架要么是关键词 图书馆 关键字 或 用户的关键字 . 前来自 标准 库 或 外部库 ,后者 中创建相同的文件在使用或进口 资源文件 . 许多关键字使用时,是很 ...
- js--题目二
//如何获取下面代码所有元素. <form> <input name="" type="text" /> <input name= ...