HDU 1560 DNA sequence(DNA序列)
HDU 1560 DNA sequence(DNA序列)
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description - 题目描述
For example, given "ACGT","ATGC","CGTT" and "CAGT", you can make a sequence in the following way. It is the shortest but may be not the only one.
二十一世纪是生物技术突飞猛进的世纪。我们知道基因由DNA组成。构建DNA的核苷酸有A(腺嘌呤),C(胞嘧啶),G(鸟嘌呤)和T(胸腺嘧啶)。寻找DNA/蛋白质序列间的最长公共子序列是现代计算分子生物学的基本问题之一。然而这个问题有些许不同。给定若干DNA序列,你需要构建一个最短序列使得给定序列都是都是它的子序列。 比如。给定"ACGT","ATGC","CGTT"和"CAGT",你可以通过如下方式构建一个序列。最短序列不唯一。
CN

The first line is the test case number t. Then t test cases follow.
In each case, the first line is an integer n ( 1<=n<=8 ) represents number of the DNA sequences.
The following k lines contain the k sequences, one per line. Assuming that the length of any sequence is between 1 and 5.
第一行为测试用例的数量t。随后t个测试用例。
每个用例中第一行为一个整数n ( 1<=n<=8 ) 表示DNA序列的数量。
随后k行,每行一个序列。假定任意序列长度为1到5。
CN
Output - 输出
For each test case, print a line containing the length of the shortest sequence that can be made from these sequences.
对于每个测试用例,输出一行可构建序列的最短长度。
CN
Sample Input - 输入样例
1
4
ACGT
ATGC
CGTT
CAGT
Sample Output - 输出样例
8
题解
IDA* = (暴力DFS + 剪枝)*反反复复,所以问题在于怎么剪枝
如果用剩余待匹配序列的最大长度来剪枝……下面的数据就有问题(虽然HDU上并没有)
1
4
AAAA
CCCC
GGGG
TTTT
然后秉着不会做就百度的原则(逃
横着看有问题,竖着看?
统计每行ACGT的个数,然后在以此求各个ACGT最大的和,依次剪枝就比上面的方法科学多了……
代码 C++
#include <cstdio>
#include <cstring>
#include <algorithm>
int maxDeep, n, data[][];
int vle(int(&siz)[][]) {
int i, j, opt, len[];
memset(len, , sizeof len);
for (i = ; i < n; ++i) {
for (j = ; j < ; ++j) len[j] = std::max(len[j], siz[i][j]);
}
for (i = opt = ; i < ; opt += len[i++]);
return opt;
}
int DFS(int deep, int(&preW)[], int(&preSiz)[][]) {
int i = vle(preSiz), j, w[], siz[][], isFid;
if (!i) return ;
if (i + deep > maxDeep) return ;
for (i = ; i < ; ++i) {
memcpy(w, preW, sizeof w); memcpy(siz, preSiz, sizeof siz);
for (j = isFid = ; j < n; ++j) {
if (data[j][w[j]] == i) {
isFid = ++w[j]; --siz[j][i];
}
}
if (isFid && DFS(deep + , w, siz)) return ;
}
return ;
}
int main() {
int t, i, j, mp[], w[], siz[][];
mp['A'] = ; mp['C'] = ; mp['G'] = ; mp['T'] = ;
memset(w, , sizeof w);
char str[];
scanf("%d", &t);
while (t--) {
memset(data, , sizeof data); memset(siz, , sizeof siz);
scanf("%d ", &n);
for (i = ; i < n; ++i) {
gets(str);
for (j = ; str[j]; ++j) ++siz[i][data[i][j] = mp[str[j]]];
}
for (maxDeep = vle(siz); !DFS(, w, siz); ++maxDeep);
printf("%d\n", maxDeep);
}
return ;
}
HDU 1560 DNA sequence(DNA序列)的更多相关文章
- hdu 6299 Balanced Sequence (括号序列,贪心)
大意: 记$f(t)$表示字符串$t$的最长括号匹配子序列, 给定n个括号序列, 求它们重排后的最大f(t). 首先可以注意到一个括号序列中已经匹配的可以直接消去, 一定不会影响最优解. 那么这样最终 ...
- POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...
- hdu 1560 DNA sequence(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others) ...
- hdu 1560 DNA sequence(迭代加深搜索)
DNA sequence Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- DNA sequence HDU - 1560
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 【HDU - 1560】DNA sequence (dfs+回溯)
DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...
- DNA sequence open reading frames (ORFs) | DNA序列的开放阅读框ORF预测
常见的ORF预测工具 Open Reading Frame Finder- NCBI ORF Finder - SMS OrfPredictor - YSU 基本概念 开放阅读框(英语:Open r ...
- HDU1560 DNA sequence —— IDA*算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Oth ...
- POJ 2778 DNA Sequence(AC自动机+矩阵加速)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9899 Accepted: 3717 Desc ...
随机推荐
- VisualStudioCode创建的asp.net core项目部署到IIS,以及遇到的问题
一.发布项目 在visual studio code中通过命令“dotnet publish”,如下图: 这里我把发布位置设置到了D:\WebSite\netcoredemo下. 二.设置IIS 0. ...
- LAYUI select 下拉框得高度
页面下得select 框 在css页面加样式 .layui-form-select dl { max-height: 152px;}
- 《图解HTTP》读书笔记(四:HTTP方法)
1.作用 告知服务器我的意图是什么使用以下方法下达命令. 2.方法 GET 方法用来请求访问已被 URI 识别的资源. 指定的资源经服务器端解析后返回响应内容. ---URI可以定位互联网上的资源 P ...
- 异步请求取得json数据
一.异步请求 在之前我们请求数据的时候都是整个页面全部刷新了一次,也就是每次请求都会重新请求所有的资源.但是在很多时候不需要页面全部刷新,仅仅是需要页面的局部数据刷新即可,此时需要发送异步请求来实现这 ...
- JavaWeb学习之三层架构实例(三)
引言 通过上一篇博客JavaWeb学习之三层架构实例(二)我们基本上已经实现了对学生信息列表的增删改查操作(UI除外),但是不难看出,代码冗余度太高了,尤其是StudentDao这个类,其中的增删改查 ...
- windows 下面安装make
1.前面文章中已经提到了wingw32的安装,安装好之后设置相应环境变量.2.打开cmd,输入 mingw-get install mingw32-make,会进行安装.3.输入 mingw32-ma ...
- .Net Core:Middleware中间件管道
.NetCore中的Middleware是装配到管道处理请求和响应的组件:每个组件都可以决定是否继续进入下一个管道.并且可以在进入下一个管道前后执行逻辑: 最后一个管道或者中断管道的中间件叫终端中间件 ...
- cocos2d-x C++ 获取网络图片缓存并展示
#ifndef __HttpGetImg__ #define __HttpGetImg__ #include "cocos2d.h" #include "HttpRequ ...
- feifeicms后台任意文件读取
前台大略看了下,本身内容比较简单,经过“洗礼”后以及没什么问题了,基本上输入都过滤了. 这次审计找到了一个后台的任意文件读取,可以读取数据库配置文件. 在DataAction.class.php文件中 ...
- Jmeter笔记(Ⅲ) Jmeter的非GUI操作
在启动Jmeter时,我们会看到这样一句提示: 不要使用GUI模式(界面模式)进行负载测试,GUI模式只能用于创建测试和调试.进行负载测试时,需要时用非GUI模式. 那么为什么进行负载测试时一定要用非 ...