POJ 1795 DNA Laboratory(状压DP)
【题目链接】 http://poj.org/problem?id=1795
【题目大意】
给出n个字符串,求一个最小长度的串,该串包含给出的所有字符串。
要求长度最小且字典序最小。
【题解】
dp[i][s]表示包括s集合字符串的第i个字符串为开头的最小值
从后往前贪心得到最小值,然后从前往后搜索得出最小字典序的答案
【代码】
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N=17,INF=0x3f3f3f3f;
string str[N],ans;
int T,Cas=0,n,dp[N][1<<N],cost[N][N];
void init(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=j&&str[i].find(str[j])!=string::npos)str[j]=str[i];
}
}sort(str,str+n);
n=unique(str,str+n)-str;
memset(cost,0,sizeof(cost));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)if(i!=j){
int len=min(str[i].length(),str[j].length());
for(int k=0;k<=len;k++){
if(str[i].substr(str[i].length()-k)==str[j].substr(0,k)){
cost[i][j]=str[i].length()-k;
}
}
}
}
}
void dfs(int id,int s){
if(s==0)return;
string tmp; int nxt=-1;
for(int i=0;i<n;i++)if(i!=id&&(s>>i&1)){
if(dp[id][s]==dp[i][s&~(1<<id)]+cost[id][i]){
string t=str[i].substr(str[id].length()-cost[id][i],str[i].length());
if(nxt==-1||t<tmp){tmp=t;nxt=i;}
}
}ans+=tmp;
dfs(nxt,s&~(1<<id));
}
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++)cin>>str[i];
if(n>1){
init();
for(int i=0;i<=n;i++)fill(dp[i],dp[i]+(1<<n),INF);
for(int i=0;i<n;i++)dp[i][1<<i]=str[i].length();
for(int s=0;s<1<<n;s++){
for(int j=0;j<n;j++)if(dp[j][s]!=INF&&(s>>j&1)){
for(int i=0;i<n;i++)if(!(s>>i&1)){
dp[i][s|1<<i]=min(dp[i][s|1<<i],dp[j][s]+cost[i][j]);
}
}
}int id=0;
for(int i=1;i<n;i++){
if(dp[i][(1<<n)-1]<dp[id][(1<<n)-1])id=i;
}ans=str[id];
dfs(id,(1<<n)-1);
}else ans=str[0];
cout<<"Scenario #"<<++Cas<<":"<< endl;
cout<<ans<<endl<<endl;
}return 0;
}
POJ 1795 DNA Laboratory(状压DP)的更多相关文章
- 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 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
随机推荐
- java语言基础第二讲 课程作业02 总结
一.编程的好习惯 1.注释习惯.单行注释://, 多行注释:/* */ . 2.程序中添加适当的空白:4个空格. 3.文件名必须与公有类名一致,即public class 类名. 4.java中 ...
- c语言为什么效率高
文章:为什么和其他语言相比C语言是快速的语言 文章:C语言的应用领域有哪些? 虽然文章写的很差劲,但是仍然可以学到点知识. 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++).代码书写规范→ ...
- 后端model传入前端JSP页面中的值判断后再取值
所遇到的问题后端model传入前端JSP页面中的值通过foreach循环内要满足条件才能取值给Div中,我们知道jsp页面中可以直接用EL表达式取值,格式就是${"model中传来的数据&q ...
- 第1张 Maven简介 学习笔记
什么是构建? 编译.运行单元测试.生成文档.打包和部署 Maven的应用: 构建工具 依赖管理工具 通过坐标系统定位到每一个构建(artifact) 项目信息管理工具 Maven对于项目目录结构.测试 ...
- Extjs 4 小记
////////////////////////////////////---Ajax 等待提示消息---/////////////////////////////////////////////// ...
- POJ 2983-Is the Information Reliable
Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years a ...
- POJ - 1469 COURSES (匈牙利算法入门题)
题意: P门课程,N个学生.给出每门课程的选课学生,求是否可以给每门课程选出一个课代表.课代表必须是选了该课的学生且每个学生只能当一门课程的. 题解: 匈牙利算法的入门题. #include < ...
- [codeforces] 585D Lizard Era: Beginning || 双向dfs
原题 有n(n<=2)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使n个任务结束后三个人得到的值是一样的.输出每次要派哪两个人,如果不行输出Impossible. n< ...
- win安装pycurl和linux安装pycurl
1.win pip install wheel http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的包: pip install e:\pycurl-7.4 ...
- MySQL的菜鸟级操作
windows下启动和关闭mysql 启动(windows): 在命令行下,进入到mysql安装路径的bin文件夹下执行:net start mysql 关闭(windows): 在启动的情况下执行: ...