POJ 1795
Time Limit: 5000MS | Memory Limit: 30000K | |
Total Submissions: 1425 | Accepted: 280 |
Description
Having started to build his own DNA lab just recently, the evil
doctor Frankenstein is not quite up to date yet. He wants to extract his
DNA, enhance it somewhat and clone himself. He has already figured out
how to extract DNA from some of his blood cells, but unfortunately
reading off the DNA sequence means breaking the DNA into a number of
short pieces and analyzing those first. Frankenstein has not quite
understood how to put the pieces together to recover the original
sequence.
His pragmatic approach to the problem is to sneak into university
and to kidnap a number of smart looking students. Not surprisingly, you
are one of them, so you would better come up with a solution pretty
fast.
Problem
You are given a list of strings over the alphabet A (for adenine), C
(cytosine), G (guanine), and T (thymine),and your task is to find the
shortest string (which is typically not listed) that contains all given
strings as substrings.
If there are several such strings of shortest length, find the smallest in alphabetical/lexicographical order.
Input
For each scenario, the first line contains the number n of strings
with 1 <= n <= 15. Then these strings with 1 <= length <=
100 follow, one on each line, and they consist of the letters "A", "C",
"G", and "T" only.
Output
output for every scenario begins with a line containing "Scenario #i:",
where i is the number of the scenario starting at 1. Then print a
single line containing the shortest (and smallest) string as described
above. Terminate the output for the scenario with a blank line.
Sample Input
1
2
TGCACA
CAT
Sample Output
Scenario #1:
TGCACAT
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define maxn 105 #define INF 10000 int n,ca,len,sum;
char s[][maxn];
int dp[][( << ) + ],dis[][];
bool vis[],done[];
string ans; int cal(int x,int y) {
int _max = ;
for(int i = ; i < strlen(s[x]); i++) {
if(s[x][i] != s[y][]) continue;
int j,k;
for( j = i,k = ; j < strlen(s[x]) && k < strlen(s[y]); j++,k++) {
if(s[x][j] != s[y][k]) break;
}
if(k == strlen(s[y])) {
done[y] = ;
break;
}
if(j == strlen(s[x])) {
_max = max(_max,j - i); }
} return -_max;
}
void init() {
for(int u = ; u < n; u++) {
if(done[u]) continue;
for(int v = ; v < n; v++) {
if(u == v || done[v]) continue;
dis[u][v] = cal(u,v); }
} } void dfs(int v,int s1) {
vis[v] = ;
int id = -;
string t("z");
for(int u = ; u < n; u++) {
if(done[u] || vis[u]) continue; if(dp[v][s1] == dp[u][s1 | ( << u)] + dis[v][u]) {
string t1(s[u] - dis[v][u],s[u] + strlen(s[u]));
if(t > t1) {
t = t1;
id = u;
}
} } if(id != -) {
ans = ans + t;
dfs(id,s1 | ( << id)); }
} void solve() {
init(); for(int s1 = ( << n) - ; s1; s1--) {
for(int v = ; v < n; v++) {
if(!(s1 & ( << v)) || done[v]) continue;
for(int u = ; u < n; u++) {
if(u == v || (s1 & ( << u)) || done[v] ) continue;
dp[v][s1] = min(dp[v][s1],dp[u][s1 | ( << u)] + dis[v][u]); }
}
} int _min = ;
for(int i = ; i < n; i++) {
if(done[i]) continue;
_min = min(_min,dp[i][ << i]);
} memset(vis,,sizeof(vis)); ans = "z";
int id;
for(int i = ; i < n; i++) {
if(done[i]) continue;
string t(s[i]);
if(dp[i][ << i] == _min && ans > t) {
ans = t;
id = i;
}
} dfs(id, << id); printf("Scenario #%d:\n",ca++);
cout << ans << endl; }
int main()
{
int t;
//freopen("sw.in","r",stdin);
scanf("%d",&t);
ca = ; while(t--) {
memset(done,,sizeof(done)); scanf("%d",&n); for(int i = ; i < n; i++) {
scanf("%s",s[i]);
} memset(dis,,sizeof(dis)); for(int i = ; i < n; i++) {
for(int s = ; s < ( << n); s++) {
dp[i][s] = ;
}
} solve();
printf("\n"); } return ;
}
POJ 1795的更多相关文章
- POJ 1795 DNA Laboratory(状压DP)
[题目链接] http://poj.org/problem?id=1795 [题目大意] 给出n个字符串,求一个最小长度的串,该串包含给出的所有字符串. 要求长度最小且字典序最小. [题解] dp[i ...
- POJ 1795 DNA Laboratory (贪心+状压DP)
题意:给定 n 个 字符串,让你构造出一个最短,字典序最小的字符串,包括这 n 个字符串. 析:首先使用状压DP,是很容易看出来的,dp[s][i] 表示已经满足 s 集合的字符串以 第 i 个字符串 ...
- poj 1795 DNA Laboratory
DNA Laboratory Time Limit: 5000MS Memory Limit: 30000K Total Submissions: 2892 Accepted: 516 Des ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
随机推荐
- js密码的校验(判断字符类型、统计字符类型个数)
/** *判断字符类型 */ function CharMode(iN) { if (iN >= 48 && iN <= 57) //数字 return 1; if (iN ...
- C++向main函数传递参数的方法(实例已上传至github)
通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...
- POJ 1384
求猜存钱罐中至少有多少钱.容易知道金币总的重量,接着背包. #include<cstdio> #include<iostream> using namespace std; # ...
- SequoiaDB数据库的一般概念介绍
SequoiaDB数据库的主要对象包括文档.集合.集合空间与索引等. 文档 SequoiaDB中的文档为JSON格式,一般又被称为记录.在数据库内部使用BSON,即二进制的方式存放JSON数据.一般情 ...
- JQuery 获取json数据$.getJSON方法的实例代码
这篇文章介绍了JQuery 获取json数据$.getJSON方法的实例代码,有需要的朋友可以参考一下 前台: function SelectProject() { var a = new Array ...
- URL锚点HTML定位技术机制
一.锚点是什么 锚点就等同于火影中的“飞雷神之术”,我们先看百科中锚点的解释: 使用命名锚记可以在文档中设置标记,这些标记通常放在文档的特定主题处或顶部.然后可以创建到这些命名锚记的链接,这些链接可快 ...
- 初级jQuery的使用
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- R简易入门(一)
本文内容来源:https://www.dataquest.io/mission/126/introduction-to-r 本文数据来源:https://www.whitehouse.gov/21st ...
- XAML 概述三
通过对前面2节对XAML的介绍,我们对XAML有了一定的认识.这一节我们来简单了解一下部分XAML命名空间(x:)语言功能. x命名空间映射的是http://schemas.microsoft.com ...
- iOS-音频格式转换-b
iOS处理音频过程中有时候需要不同格式的音频进行转换,最近需要将m4a格式的音频转换成wav,在网上搜索之后代码整理如下: - (void)convetM4aToWav:(NSURL *)origin ...