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;
}
时间: 2024-10-07 00:19:38

HDU 1560 DNA sequence A* 难度:1的相关文章

HDU 1560 DNA sequence(DNA序列)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: center; font-family: 宋体; color: rgb(26,92,200); font-weight: bold; fo

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

DNA sequence Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 15   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description The twenty-first century

HDU 1560 DNA sequence(IDA*)

DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6042    Accepted Submission(s): 2735 Problem Description The twenty-first century is a biology-technology developing century. We kno

HDU - 1560 DNA sequence

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

HDOJ 1560 DNA sequence 状压dp 或 IDA*

http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意: 给不超过8个子串,每个子串最多5位,且都只包含ATCG,求最短的母串长度. 分析: 又是上个月写的,所以有点忘了..正解是IDA*.然后可以状压dp,记忆化搜索.dp[i],i用6进制表示,每位表示对应的子串匹配那么多长度所需要的最短母串长度.比如两个子串,13=2*6^1+1*6^0,dp[13]就表示第一个串匹配了第一位,第二个串匹配前两位所需要的最短母串长度. 状态讲完了,不过实际上程序里

POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)

曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x][y] + 1) , 其中nx为x后继结点,ny为从y转移过来的新状态,更新时加入队列 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<al

DNA sequence HDU - 1560

DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4217    Accepted Submission(s): 2020 Problem Description The twenty-first century is a biology-technology developing century. We kno

【HDU - 1560】DNA sequence (dfs+回溯)

DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长公共子序列是一个基础性问题. 但是我们的问题不是那么简单:现在我们给定了数个DNA序列,请你构造出一个最短的DNA序列,使得所有我们给定的DNA序列都是它的子序列. 例如,给定"ACGT","ATGC","CGTT","CAGT"

hdu 1379 DNA Sorting

DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1924    Accepted Submission(s): 949 Problem Description One measure of ``unsortedness'' in a sequence is the number of pairs of entrie