深度优先搜索 迭代加深搜索 hdu 1560

来源:互联网 发布:武汉专业淘宝摄影 编辑:程序博客网 时间:2024/06/05 14:48

   这道题题意:从n个串中找出一个最短的公共串(也许应该说序列吧,因为不要求连续,即只要保持相对顺序就好)。

所谓迭代加深搜索,就是限制DFS的深度,若搜不到答案,则加深深度,重新搜索,这样就防止了随着深度不断加深而进行的盲目搜索,而且,对于这种求最短长度之类的题目,只要找到可行解,即是最优解了。同时注意剪枝,每次DFS的时候,都要判断一下,当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回上一层状态。

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<vector>#include<stack>#include<map>#define maxn 10#define lson step<<1#define rson step<<1|1using namespace std;char DNA[4]={'A','C','G','T'};int n,deep,ans; string s[maxn];int max(int x,int y){if(x>y)return x;return y;}void dfs(int index,int len[]){if(ans!=-1)//已经搜到最优解 不必再往下搜return ;if(index>deep)//大于限制的深度,不用往下搜索{return ;}int maxx=0;//预计还要匹配的字符串的最大长度    for(int i=0;i<n;i++){maxx=max(s[i].size()-len[i],maxx);}if(index+maxx>deep) //剪枝   return ;if(maxx==0)//条件全部满足即为最优解  {ans=index;return ;}for(int i=0;i<4;i++){int pos[maxn];int flag=0;for(int j=0;j<n;j++){if(s[j][len[j]]==DNA[i])//表示该字母可以往下搜索{pos[j]=len[j]+1;flag=1;}elsepos[j]=len[j];}if(flag)dfs(index+1,pos);}}int main(){int T;cin>>T;while(T--){cin>>n;deep=0;//搜索深度  for(int i=0;i<n;i++){cin>>s[i];deep=max(deep,s[i].size());//找出最长的串的长度,作为初始时的迭代DFS的限制 } int pos[maxn];//记录n个字符串目前匹配到的位置  memset(pos,0,sizeof(pos));while(1){ans=-1;dfs(0,pos);if(ans!=-1)break;deep++;//加深迭代 }cout << ans << endl;}return 0;}



原创粉丝点击