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;
}
这种做法还是第一次,不过这里的搜索思想还是和以前基本上相同的,迭代深搜关键还是迭代,其实也不难理解
这个题目的搜索如果不限制深度的话可能就是一个无穷无尽的搜索,所以一定要我们来认为加入一个条件让其退出
搜索,所以就从可能的答案的最小向上迭代搜索,搜索到第一个就是题目答案!
不谈迭代这个题目的搜索思想也是绝对经典的!
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 1560 DNA sequence (IDA* 迭代加深 搜索)
- hdu 1560 DNA sequence(迭代加深搜索)
- hdu 1560 DNA sequence(迭代加深搜索)
- HDU1560 DNA sequence 迭代深搜IDA*
- hdu1560 DNA sequence (迭代加深搜索)
- HDU - 1560 DNA sequence 迭代加深搜索
- HDU-1560-DNA sequence(迭代深搜)
- hdu 1560 DNA sequence(迭代加深搜索)(经典题)
- HDU-#1560 DNA sequence(迭代加深搜)
- hdu 1560 DNA sequence(迭代加深搜索)
- HDU-1560 DNA sequence (迭代深搜)
- HDU 5297 Y sequence (容斥原理 +迭代)
- HDU 1560 DNA sequence A* 难度:1
- HDU-1560 DNA sequence
- HDU1560 DNA sequence(IDA星) (E)
- HDU 1560 - DNA sequence ( IDA* )
- HDU-2778 DNA Sequence(AC自动机)
- HDU-1560 DNA sequence(IDA*)
- HDU 1506 DNA sequence IDA*
- HDU 5297 Y sequence 容斥 迭代