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 ...
随机推荐
- POJ 2533
最长上升子序列裸题在网上看到有两种方法...一种复杂度O(N^2),一种O(NlogN).orz O(N^2): #include<cstdio> #define N 1001 int m ...
- C++中extern “C”含义深层探索
C++中extern “C”含义深层探索 extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到.但extern “C” 永远只能在cpp引 ...
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- 运行maven报错:经过检查是因为maven不兼容jdk1.6,重新安装1.7解决
cmd mvn -v报错: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apach ...
- zedboard - 轻量级以太网控制器LWIP
ipconfig/all route print 显示本机所有的网络 网关是什么 那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址.比如有网络A和网络B,网络A的IP地址范围为&qu ...
- 获取iOS设备信息的编程接口
参考资料: [1] 博客园,iOS屏幕尺寸和分辨率了解 [2] 张兴业,获取手机信息(UIDevice.NSBundle.NSLocale), CSDN
- EcilpsePHP studio 3.0 运行(run)环境配置
EcilpsePHP studio 3.0的界面与 MyEclipse操作界面基本一样,熟悉后者的对于EcilpsePHP studio 的使用学习就不会太难了. 安装好EPP后,新建项目--> ...
- Allegro中板子边框不封闭导致的z-copy无法用的问题
画一个不规则的边框,有半圆形状,导致边框不封闭,无法使用Z-COPY命令,下边是解决办法: 1 画好Outline后,选择 shape -> Compose Shape , options选项卡 ...
- linux 标准io笔记
三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的. 2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进 ...
- CentOS thrift python demo
编辑接口文件 hellowworld.thrift service HelloWorld { string ping(), string say(1:string msg) } 编辑 server.p ...