poj 1699 Best Sequence

http://poj.org/problem?id=1699

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

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

 1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #define maxn 500
5 using namespace std;
6 const int inf=1<<30;
7
8 char str[maxn][maxn];
9 int c[maxn][maxn];
10 int n;
11 bool vis[maxn];
12
13 int make_l(int s,int t)
14 {
15 int cnt=0;
16 int k1=strlen(str[s]);
17 int k2=strlen(str[t]);
18 for(int i=0; i<=k1&&i<=k2; i++)
19 {
20 bool flag=false;
21 for(int j=0; j<i; j++)
22 {
23 if(str[s][k1-i+j]!=str[t][j])
24 {
25 flag=true;
26 break;
27 }
28 }
29 if(!flag) cnt=i;
30 }
31 return k1-cnt;
32 }
33
34 int dfs(int src,int step)
35 {
36 int sum=inf;
37 if(step==n)
38 {
39 int kl=strlen(str[src]);
40 return kl;
41 }
42 for(int i=1; i<=n; i++)
43 {
44 if(!vis[i])
45 {
46 vis[i]=true;
47 int sum1=c[src][i];
48 sum1+=dfs(i,step+1);
49 vis[i]=false;
50 sum=min(sum,sum1);
51 }
52 }
53 return sum;
54 }
55
56 int main()
57 {
58 int t1;
59 scanf("%d",&t1);
60 while(t1--)
61 {
62 scanf("%d",&n);
63 for(int i=1; i<=n; i++)
64 {
65 scanf("%s",str[i]);
66 }
67 memset(c,0,sizeof(c));
68 for(int i=1; i<=n; i++)
69 {
70 for(int j=1; j<=n; j++)
71 {
72 if(i==j) continue;
73 c[i][j]=make_l(i,j);
74 }
75 }
76 /*for(int i=1; i<=n; i++)
77 {
78 for(int j=1; j<=n; j++)
79 {
80 printf("%d ",c[i][j]);
81 }
82 printf("\n");
83 }*/
84 memset(vis,false,sizeof(vis));
85 int ans=inf;
86 for(int i=1; i<=n; i++)
87 {
88 vis[i]=true;
89 ans=min(ans,dfs(i,1));
90 vis[i]=false;
91 }
92 printf("%d\n",ans);
93 }
94 return 0;
95 }

poj 1699 Best Sequence,布布扣,bubuko.com

时间: 2024-10-11 11:23:12

poj 1699 Best Sequence的相关文章

poj 1699 Best Sequence(AC自动机+状压DP)

题目链接:poj 1699 Best Sequence 题目大意:给定N个DNA序列,问说最少多长的字符串包含所有序列. 解题思路:AC自动机+状压DP,先对字符串构造AC自动机,然后在dp[s][i]表示匹配了s,移动到节点i时候的最短步数. #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <iostream> #include &

POJ 1699 Best Sequence (DFS+预处理)

题意:看那张图就一清二楚了吧, N个序列首位相连(相同的序列部分),得到最短的总序列. 题目链接:http://poj.org/problem?id=1699 ~~~~ 思路就是:将N个序列首尾相连能重合的长度求粗来.然后DFS枚举每种首尾相连的情况. #include<cstdio> #include<cstring> #include<algorithm> #define N 22 #define INF 0x7fffffff using namespace std

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

poj 1699 Best Sequence (搜索技巧 剪枝 dfs)

题目链接 题意:给出几个基因片段,要求你将它们排列成一个最短的序列,序列中使用了所有的基因片段,而且不能翻转基因. 分析:先计算出add数组,再dfs枚举. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <vector> 7 #include <al

poj 1699 Best Sequence(dfs)

http://poj.org/problem?id=1699 题意:给出n个只含A,C,G,T的字符串,要求能把这n个字符串组合起来的最短长度. 思路:预处理一下,a[i][j]表示将第j个字符串连接到第i个字符串后面增加的长度,那么我们需要找出这样一个序列1,2....n满足a[1][2] + a[2][3] + ...+a[n-1][n]的最小值.DFS就OK了,任选一个字符串作为起点进行dfs,求出所有的情况后得到最小的长度. #include <stdio.h> #include &l

POJ 1019 Number Sequence 题解

这又是一道看似简单,实际挺困难的题目. 本来想做道基础题消遣一下的,没想到反被消遣了-_-|||. 看个人的基础吧,对于数学好的会简单点,但是由于情况太多,需要都考虑全,故此难度应该在4星以上了. 我这里使用的方法就是直接打表,然后直接模拟,利用打表去掉一大段数据,剩下数据量十分小了,故此可以直接模拟. 打表是为了计算前面的周期数,把周期数直接去掉. 主要难点是后面10位数以上的数有2位, 3位,4位等情况要考虑.- 下面使用getNewNums一个函数解决了,想通了,就几行代码,还不用难理解的

uva1626 poj 1141 Brackets Sequence 区间dp 打印路径

// poj 1141 Brackets Sequence // 也是在紫书上看的一题,uva就是多了一个t组数据. // 经典区间dp // dp(i,j)表示区间[i,j]内所需要增加的括号数目 // 则分为两种情况 // 一种是s[i]和s[j]是匹配的则 // dp[i][j] = min(dp[i][j],dp[i+1][j-1]) // 另外一种情况是不匹配 // dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]){i<k<j}; // 但是无

POJ 2478 Farey Sequence

Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3,

练手题,没事就来AC吧 poj 4044 Score Sequence

此题为12年金华邀请赛A题 克隆了下比赛,A题最简单,也是最挑战人数据处理能力的一题,可惜自己数据处理能力太弱 久久不能写出代码---- 总结下就是题做少了,平时应多做题,少灌水,应放下看电影的时间,玩各种软件的时间 先做好一项再说才是正道,看到一句话说得好 "   人有两条路要走,一条是必须走的,一条是想走的,你必须把必须走的路走漂亮,才可以走想走的路..." 不扯了,贴代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20