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

poj 1699 Best Sequence

2014-06-02 21:26 351 查看
http://poj.org/problem?id=1699

题意:给你n个长度为L的序列,求包含这几个序列的最短长度。

先预处理每两个序列之间的关系,然后dfs枚举就行。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 500
using namespace std;
const int inf=1<<30;

char str[maxn][maxn];
int c[maxn][maxn];
int n;
bool vis[maxn];

int make_l(int s,int t)
{
int cnt=0;
int k1=strlen(str[s]);
int k2=strlen(str[t]);
for(int i=0; i<=k1&&i<=k2; i++)
{
bool flag=false;
for(int j=0; j<i; j++)
{
if(str[s][k1-i+j]!=str[t][j])
{
flag=true;
break;
}
}
if(!flag) cnt=i;
}
return k1-cnt;
}

int dfs(int src,int step)
{
int sum=inf;
if(step==n)
{
int kl=strlen(str[src]);
return kl;
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
{
vis[i]=true;
int sum1=c[src][i];
sum1+=dfs(i,step+1);
vis[i]=false;
sum=min(sum,sum1);
}
}
return sum;
}

int main()
{
int t1;
scanf("%d",&t1);
while(t1--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%s",str[i]);
}
memset(c,0,sizeof(c));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) continue;
c[i][j]=make_l(i,j);
}
}
/*for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}*/
memset(vis,false,sizeof(vis));
int ans=inf;
for(int i=1; i<=n; i++)
{
vis[i]=true;
ans=min(ans,dfs(i,1));
vis[i]=false;
}
printf("%d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: