poj 1699 Best Sequence
2024-10-18 19:23:57
http://poj.org/problem?id=1699
题意:给你n个长度为L的序列,求包含这几个序列的最短长度。
先预处理每两个序列之间的关系,然后dfs枚举就行。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 500
using namespace std;
const int inf=<<; char str[maxn][maxn];
int c[maxn][maxn];
int n;
bool vis[maxn]; int make_l(int s,int t)
{
int cnt=;
int k1=strlen(str[s]);
int k2=strlen(str[t]);
for(int i=; i<=k1&&i<=k2; i++)
{
bool flag=false;
for(int j=; 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=; i<=n; i++)
{
if(!vis[i])
{
vis[i]=true;
int sum1=c[src][i];
sum1+=dfs(i,step+);
vis[i]=false;
sum=min(sum,sum1);
}
}
return sum;
} int main()
{
int t1;
scanf("%d",&t1);
while(t1--)
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%s",str[i]);
}
memset(c,,sizeof(c));
for(int i=; i<=n; i++)
{
for(int j=; 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=; i<=n; i++)
{
vis[i]=true;
ans=min(ans,dfs(i,));
vis[i]=false;
}
printf("%d\n",ans);
}
return ;
}
最新文章
- iOS-APP提交上架流程(新手必看!2016年3月1日最新版)
- WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常
- JavaScript RegExp 对象(来自w3school)
- How to Use JUnit With JMeter
- jQuery简单邮箱验证
- 证明:寝室分配问题是NPC问题
- iOS 添加阴影后 屏幕卡顿 抖动
- 函数page_cur_search_with_match
- android79 Fragment生命周期
- AE-分享<;学习后,制作的视频实例>;小视频-与大家交流!
- php中对MYSQL操作之批量运行,与获取批量结果
- String的Split方法的用法与要注意事项
- Visual Studio 2013 IIS Explorer 停止调试继续访问站点
- SD卡读写扇区注意事项(转)
- java加密算法入门(一)-算法概念及单向加密
- ubuntu + 不识别无线网卡简易处理方式 + 需有线联网
- STL—之迭代器,文中推荐的博客很给力
- linux redis 主从复制
- --num 与 num-- 的区别
- 18华南理工校赛 K 小马哥的超级盐水