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行那样,那以前的方法就 ...
随机推荐
- linux查看80端口占用情况
netstat -anltp|grep 80
- Codeforces 1088E 树形dp+思维
比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...
- [Leetcode/Javascript] 461.Hamming Distance
[Leetcode/Javascript] 461.Hamming Distance 题目 The Hamming distance between two integers is the numbe ...
- 爬虫:Scrapy8 - Item Pipeline
当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,一些组件会按照一定的顺序执行对 Item 的处理. 每个 item pipeline 组件(有时也称之为“It ...
- 【linux】如何解决VMWare上linux虚拟机连不上外网的问题?
>>>故障现象:虚拟机连接不到外网? >>>故障背景: Centos7.4发行版本: 虚拟机和VM软件都是nat模式: 注意这里默认的VMWare的DHCP服务时开 ...
- Nginx出现500错误解决办法
查看错误日志D:\nginx\logs\error.log 得知:Nginx配置文件中会将路径中的 \t 默认转义成 空格 改为双斜杠就可以了
- Android 热更新是如何实现的?
Android开发中,我们常常遇到热更新这个概念,而这个热更新具体是怎么实现的呢?今天在网上看到一个大神分享的热更新相关实现原理和实现代码,感觉灰常不错,分享给广大码农盆友look look . Cl ...
- [CF932D]Tree
题目大意:两种操作: $1\;u\;w:$把下一个点挂在$u$下,权值为$w$. $2\;u\;w:$询问从$u$开始的序列的最长长度.序列为从$u$开始的祖先序列中的不严格上升序列 题解:可以把一个 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- [转]busybox中telnet 功能添加
使用busybox制作的一个基本根文件系统如何添加telnetd服务呢? 下面把本人的添加过程列出来供大家分享,如有不同意见请不吝赐教! 1. 添加telnet的支持(busybox中配置) Netw ...