HDU 1568 DNA sequence(迭代深搜)

本文介绍了一种利用迭代深搜解决最长公共子序列问题的方法,通过限制搜索深度来寻找满足条件的最短长度。文章详细解释了pos数组的作用及get_max函数如何计算最少还需多少长度来满足要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这种做法还是第一次,不过这里的搜索思想还是和以前基本上相同的,迭代深搜关键还是迭代,其实也不难理解

这个题目的搜索如果不限制深度的话可能就是一个无穷无尽的搜索,所以一定要我们来认为加入一个条件让其退出

搜索,所以就从可能的答案的最小向上迭代搜索,搜索到第一个就是题目答案!

不谈迭代这个题目的搜索思想也是绝对经典的!

pos[i]表示的是第i(从第0开始)个串已经存在子系列在当前找到的串中子系列的长度

get_max函数计算的就是最少还需要多长才能满足要求,如果当前要求最短的长度都

超过迭代的值的话就说名这次迭代失败,不可能答案是deepth的值!

仔细分析下程序就明白了,说还不怎么能说清楚!


#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define MAX(a,b) (a>b?a:b)
struct point{
    char str[10];
    int length;
}po[10];
int pos[10],n,deepth;
const char *dir="ACGT";
int get_max(){
    int ans=0;
    for(int i=0;i<n;i++){
        ans=MAX(ans,po[i].length-pos[i]);
    }
    return ans;
}
bool dfs(int deep){
    int temp=get_max();
    if(temp+deep > deepth) return false;
    if(temp==0) return true;
    bool flag=false;
    for(int i=0;i<4;i++){
        int tem[10];
        flag=false;
        memcpy(tem,pos,sizeof(pos));
        for(int j=0;j<n;j++){
            if(po[j].str[pos[j]]==dir[i]){
                flag=true;
                pos[j]++;
            }
        }
        if(flag){
            if(dfs(deep+1)) return true;
            memcpy(pos,tem,sizeof(tem));
        }
    }
    return false;
}
int main(){
    int i,j,k,t,Max;
    scanf("%d",&t);
    while(t--){
        Max=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%s",po[i].str);
            po[i].length=strlen(po[i].str);
            Max=MAX(Max,po[i].length);
        }
        memset(pos,0,sizeof(pos));
        deepth=Max;
        while(!dfs(0)) deepth++;
        printf("%d\n",deepth);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值