您的位置:首页 > 产品设计 > UI/UE

HDU 1568 DNA sequence(迭代深搜)

2013-09-05 20:25 316 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 HDU