HDU - 1560 DNA sequence 【迭代加深】

HDU 1560 DNA sequence加深迭代dfs】【IDA*】 DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4172    Accepted Submission(s): 2005   Problem Description The twenty-first ce... 阅读详情

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560

关于迭代加深,可以参考这篇博客 https://blog.csdn.net/hzaukotete/article/details/81226556

迭代加深是在dfs的基础上,枚举深搜的深度 dep。

比如说 我一开始规定 dep == 1,当dfs深搜到深度为 1的时候就回溯,如果dep == 1没有找到答案,那么就让dep+1,继续从头开始深搜,当深度到2的时候就回溯。以此类推,直到找到答案时,dep就是我们要求的答案。也就是说,设置的dep是不管找没找到答案,到了规定的深度dep就回溯。

这种深搜有点类似bfs。

此外迭代加深的搜索一定要有一个比较有效的剪枝方法来减少搜索的次数。

最常用的方法是设置一个估计值,这个估计值不需要太精确,大概估计即可,如果这个估计值超出了规定的dep,那么就不必要做dfs了,直接dep++,以此来减少dfs的搜索次数。

思路:

枚举每一位可能出现的字母。

如样例1,给每一个字符串都设置一个指针,初始指向第一位,如果设置第一个字母为A,那么把所有指针指向的字母为A的指针都后移一位,然后继续枚举第二个字母。直到所有的指针都指向最末尾的时候,就能得到答案。

这里迭代深搜的估计方法也很简单,要想找到答案,设置的dep最起码要等于或者大于字符串最长的那个字符串的长度。同样的,在搜索的过程中,要想找到答案,当前步数step + 指针距离末尾最长的长度 <= dep。

#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int Maxn = 4e5+10;

struct Q {
    int num[10], p, cur;
} qu[10];

int N, dep, ans;

void dfs(int step) {
    bool vis[10], mark[10];
    int maxn = 0;

    for(int i = 0; i < N; ++i) {
        maxn = max(maxn, qu[i].p-qu[i].cur);
    }
    if(maxn == 0) {
        ans = step; return;
    }
    if(maxn+step > dep) return;

    memset(vis, false, sizeof(vis));
    memset(mark, false, sizeof(mark));

    for(int i = 0; i < N; ++i) {
        if(qu[i].cur == qu[i].p) continue;
        int tmp = qu[i].num[qu[i].cur];

        if(vis[tmp]) continue;
        vis[tmp] = true;

        for(int j = 0; j < N; ++j) {
            if(qu[j].cur == qu[j].p) continue;
            if(qu[j].num[qu[j].cur] == tmp) {
                qu[j].cur++; mark[j] = true;
            }
        }
        dfs(step+1);
        if(ans != -1) return;
        for(int j = 0; j < N; ++j) {
            if(mark[j]) {
                qu[j].cur--; mark[j] = false;
            }
        }
    }
}

int main(void)
{
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &N);
        char str[10];
        for(int i = 0; i < N; ++i) qu[i].cur = qu[i].p = 0;
        for(int i = 0; i < N; ++i) {
            scanf("%s", str);
            for(int j = 0; j < strlen(str); ++j) {
                if(str[j] == 'A') qu[i].num[qu[i].p++]= 1;
                else if(str[j] == 'C') qu[i].num[qu[i].p++]= 2;
                else if(str[j] == 'G') qu[i].num[qu[i].p++]= 3;
                else if(str[j] == 'T') qu[i].num[qu[i].p++]= 4;
            }
        }
        ans = -1; dep = 1;
        while (ans == -1) {
            dfs(0); dep++;
        }
        printf("%d\n", ans);
    }
	return 0;
}

 

HDU-1560 DNA sequence【构造答案+IDA*剪枝】 题目大意: 给N个字符串,求一个最短序列能否将N个字符串包含。输出最短序列的长度。 思路: 可以构造一个最短序列,然后判断能否将所有序列包含进去。然后用IDA*剪枝(这到没错)。构造的过程并不复杂,因为只涉及4个碱基。再有就是回溯的问题,这里需要对每个字符串设置一个指针,用于判断包含关系。最后的包含关系肯定是所有字符串的指针都走到了最后一个元素。可以用数组来存每个字符串当前的指针位置,但是每个状态有不一样,这里可以用一个数组参数传递到下一个状态上,这样就避免了回溯麻烦的问题产生。 反思: 这个构造确实巧妙, 阅读详情

相关推荐

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5008

C1. Increasing Subsequence (easy version)

put contains one integer n (1≤n≤2⋅105) — the number of elements in a. The second line of the input contains n integers a1,a2,…,an (1≤ai≤n), where ai is the i-th element of a. All these integers are pa...

轻舟载君不载愁 513

从设计到实战:手把手教你用SolidWorks完成一个简易离心泵叶轮的水力设计全流程

本文详细介绍了使用SolidWorks进行简易离心泵叶轮水力设计的全流程,涵盖参数计算、水力设计和三维建模等关键步骤。通过实际案例演示,帮助机械设计工程师和学生掌握从理论到实践的转化技巧,特别适合低比转速离心泵叶轮的设计需求。

weixin_30621711的博客 195

HDU 1560 迭代加深 解题报告

hdu1560

onepointo 523

DNA sequence HDU - 1560

DNA sequence HDU - 1560

weixin_29216119的博客 272

HDU-1560

使用IDA*:迭代dfs+剪枝 首先读取每一个字符串 然后选择最大长度作为初始深度 每次迭代+1 设置三个数组: dna序列数组 当前匹配数组 最短dna序列数组 剪枝: 剩余匹配数组的最大值小于深度-当前dna序列的长度 每次dfs都更新当前匹配数组。本题我根据大佬的代码做了一些改动 使用pos[]全局变量作为记录当前追踪过程 每次遍历完后回溯。其次就是dfs遍历的原理 逻辑一定要严谨 不能有疏漏 再接再厉吧。做了几道IDA*的题发现关键还是求最小代价作为剪枝是关键。

m0_73596392的博客 319

HDU 1560 sequence

题目链接 Problem Description The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosin...

qq_43735840的博客 213

hdu 1560 DNA sequence迭代加深搜索)

题意:找到一个最短的序列,使得输入的所有序列都是这个序列的子序列。输出最短序列的长度 DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 687    Accepted Submission(

2102

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

DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1296 Accepted Submission(s): 648 Problem Description The twenty-first century ...

qq_18952045的博客 173

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个指针,当全部指针为串尾时判断构造的长度,由于状态空间过大,但是又存在冗余搜索...

diansitao5461的博客 141

HDU - 1560DNA sequence迭代加深搜索基础题 )

Problem Description The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosi...

橘嘉禾 363

HDU 1560 DNA sequence迭代加深搜索)

The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thy...

weixin_30469895的博客 132

hdu 1560 DNA sequence迭代加深)​​​​​​​

题目链接:hdu 1560 DNA sequence 题意:构造一个最短的字符串,使得给出的n个字符串(只包含ACGT)都是这个字符串的字串(可以不连续),输出字符串的长度。 思路:最短为n个字符串中最长串的长度,最长为n个字符串长度之和,在这个范围内dfs。具体dfs内容见代码注释 #include&lt;cstdio&gt; #include&lt;cstring&gt; #inc...

yz467796454的博客 196

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

题意: 从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好。 思路: 用迭代加深搜索,所谓迭代加深搜索,就是限制DFS的深度,若搜不到答案,则加深深度,重新搜索,这样就防止了随着深度不断加深而进行的盲目搜索,而且,对于这种求最短长度之类的题目,只要找到可行解,即是最优解了。同时注意剪枝,每次DFS的时候,都要判断一下,当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回上一层状态。

sunny crazy 2280

hdu 1560(搜索 +哈希)

题目连接:https://vjudge.net/contest/353606#problem/E 思路: 每次搜索最终串的当前位置的字符,因为只有四个字符,所以要找到下一个字符一定要减少这些字符串的长度,当所有子序列都满了的时候结束,重点是更新。 代码: #include <bits/stdc++.h> using namespace std; const uns...

积少成多,水滴石穿 325

HDU - 1560 (IDA*, DFS + 回溯)

HDU - 1560 DNA sequence Problem Description The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thymine). Findi

weixin_43538217的博客 297

HDU - 1560 DNA sequence 迭代加深搜索

DNA sequenceDescriptionThe twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine),

ywq12138的博客 452

HDU-1560 DNA sequence

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意: 给出一些dna序列,找出一个最短的满足包含所有这些子字符串的字符串,只要字符串中各字母相对位置相同即可。 思路: 要找最短的满足包含所有串的字符串,慢慢扩大搜索范围寻找即可,就是IDA*,迭代加深搜索,不断加大搜索深度然后dfs判断是否有答案。 代码: int n,m; in

MyWorld 1060

HDU - 1560----DNA sequence

The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thym

莫天 682

pandas安装包(whl)pandas-1.5.0-cp38-cp38-win_amd64.zip

pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可!下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。再也不用担心pip联网下载网络超时,各种安装不成功的问题。

上一篇: HDU - 3533 Escape 【BFS】
下一篇: ZOJ - 2477 Magic Cube 【迭代加深+模拟】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值