题意:
给你N个DNA子序列,请求出包含这些子序列的最短DNA序列的长度
思路:
用IDA*暴力,用指针推进每一个子序列
代码附:
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define pf push_front
using namespace std;
const int N = 2e5+10;
int n,ans,deep;
int len[10];
char ss[10][10];
char DNA[10]= {"ATCG"};
int Astar(int poi[])
{
int h=0;
for(int i=0; i<n; ++i)
h=max(h,len[i]-poi[i]);
return h;
}
void IDAstar(int cur,int poi[])
{
int h=Astar(poi);
if(!h)
{
ans=cur;
return ;
}
if(h+cur>=deep)
return ;
int now[10];
for(int i=0; i<4; ++i)
{
bool flag=0;
for(int j=0; j<n; ++j)
{
if(DNA[i]==ss[j][poi[j]])
{
flag=1;
now[j]=poi[j]+1;
}
else
now[j]=poi[j];
}
if(flag)
IDAstar(cur+1,now);
if(ans)
return ;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
cin>>n;
deep=ans=0;
for(int i=0; i<n; ++i)
{
cin>>ss[i];
len[i]=strlen(ss[i]);
deep=max(deep,len[i]);
}
int poi[10]= {0};
while(!ans)
{
IDAstar(0,poi);
deep++;
}
cout<<ans<<endl;
}
return 0;
}