【IDA*】hdu 1560

来源:互联网 发布:java实现短信发送功能 编辑:程序博客网 时间:2024/05/01 15:46

http://acm.hdu.edu.cn/showproblem.php?pid=1560

分析:这已经是神一般的剪枝了,膜拜……


#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int NM=10;char str[NM][NM],cs[4]={'A','C','T','G'};int v[NM],len[NM],sta[NM],dep,n;bool flag;int compare()  //A*的估价函数{int i,t,mmax;mmax=0;for(i=0;i<n;i++){t=len[i]-v[i];if(t>mmax) mmax=t;}return mmax;}bool DFS(int t){int i,j,leave;int sta[NM];  //leave=compare();if(leave==0) return true;if(t+leave>dep) return false;  //剩下需要匹配的单词个数+当前已匹配的单词个数for(i=0;i<n;i++) sta[i]=v[i];for(j=0;j<4;j++){flag=false;for(i=0;i<n;i++){if(str[i][v[i]]==cs[j])  //匹配一个字符串的第v[i]个字符{flag=true;v[i]++;}}if(!flag) continue;  //没有一个匹配成功,说明该字符无效if(DFS(t+1)) return true;for(i=0;i<n;i++) v[i]=sta[i];  //}return false;}int main(){int T,i;scanf("%d",&T);while(T--){scanf("%d",&n);dep=0;for(i=0;i<n;i++){scanf("%s",str[i]);len[i]=strlen(str[i]);if(dep<len[i]) dep=len[i];}memset(v,0,sizeof(v));while(!DFS(0)) //为了找出最少的所需添加的字母数dep++;printf("%d\n",dep);}return 0;}


0 0
原创粉丝点击