传送门

题目:

Problem Description

The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thymine). Finding the longest common subsequence between DNA/Protein sequences is one of the basic problems in modern computational molecular biology. But this problem is a little different. Given several DNA sequences, you are asked to make a shortest sequence from them so that each of the given sequence is the subsequence of it.

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.

Input

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.

Output

For each test case, print a line containing the length of the shortest sequence that can be made from these sequences.

Sample Input

1
4
ACGT
ATGC
CGTT
CAGT

Sample Output

8

代码:

#include<bits/stdc++.h>
using namespace std;
char DNA[]={"AGCT"};
int n,t,depth;
int pos[10];//记录每个字符串匹配到哪了
struct node{char str[6];int lenth;
}a[10];
int check_len(){//得到当前还需要匹配的最大长度int max_len=0;for(int i=1;i<=n;i++){max_len=max(max_len,a[i].lenth-pos[i]);}return max_len;
}
bool ida(int k){//k表示已经使用的长度int len=check_len();//还需要匹配的最大长度+已经匹配的长度>迭代深度,则不可能完成匹配if(len+k>depth) return false;if(len==0) return true;//说明所有字符串已匹配完成for(int i=0;i<4;i++){//逐个增加字符进行匹配int flag=0;int temp[10];//记录当前字符匹配的情况,用于状态的回溯for(int j=1;j<=n;j++) temp[j]=pos[j];for(int j=1;j<=n;j++){//扫描匹配各个字符串if(a[j].str[pos[j]]==DNA[i]){flag=1;pos[j]++;//已匹配字符的个数加1}}if(flag){//存在匹配则继续向下搜索if(ida(k+1)) return true;else{for(int j=1;j<=n;j++){//回溯到匹配字符前的状态pos[j]=temp[j];}}}}return false;
}
int main()
{cin>>t;while(t--){memset(a,0,sizeof(a));memset(pos,0,sizeof(pos));cin>>n;depth=0;for(int i=1;i<=n;i++){scanf("%s",a[i].str);a[i].lenth=strlen(a[i].str);depth=max(depth,a[i].lenth);//得到的字符串最短为输入的字符串中最大的长度}while(1){if(ida(0)) break;else depth++;}cout<<depth<<endl;}return 0;
}

总结:

经典的IDA*题目,比较难思考的地方在于匹配字符的状态的回溯,使用了一个新的数组先把当前状态保存起来。

hud 1560 DNA sequence(IDA* 迭代加深搜索+估值函数)相关推荐

  1. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  2. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  3. 启发式搜索 迭代加深搜索 搜索对象的压缩存储

    常见的几种搜索算法 常见的几种搜索算法_唐宋缘明卿_cris的博客-CSDN博客_搜索算法有哪些 搜索 -- 启发式搜索 搜索 -- 启发式搜索_Alex_McAvoy的博客-CSDN博客_启发式搜索 ...

  4. HDU 1560 DNA sequence(DNA序列)

    HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K  ...

  5. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

  6. C++迭代加深搜索及其例题讲解—————Addition Chains

    前言: 学习算法时,一个关键的问题是什么时候来使用它.在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说 ...

  7. NUIST OJ 1347 供电站 [迭代加深搜索]

    题目 题目分析 本题的坑 整体代码与运行结果 题目 题目描述 你一个程序员,不知为何就当上了你们镇的镇长(人的一生当然要靠自我奋斗,当然也要考虑历史的进程).你们镇有 N (3 <= N < ...

  8. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

  9. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

最新文章

  1. 机器也学会如何做「阅读理解」了? 云从科技上交大提出的DCMN+ 模型为你解答!!!...
  2. 6.11 将分割数据转换为多值IN列表
  3. android listview 游标,Android Listview - 使用游标时无法选择多个项目
  4. 步步为营-72-asp.net简单练习(通过webForm实现一些简单实例)
  5. linux sar 历史负载,查看负载、vmstat、top、sar以及nload命令
  6. angular - 如何运行在起来 - 使用nginx
  7. pythonclass全局变量_Python的变量(全局变量、局部变量、类变量和实例变量)
  8. c语言普通字符放哪里,C语言字符串的输入输出
  9. 数据库连接,实现增删改查操作具体步骤(全)
  10. MySQL----商品表及商品分类表例子
  11. Android 父类super.onDestroy();的有关问题
  12. 玩游戏计算机什么比较重要,台式机和笔记本玩游戏-玩游戏电脑三大件哪一个最重要? – 手机爱问...
  13. 超级计算机也无法算尽圆周率,如果圆周率算尽了,会出现什么后果?
  14. Java求时间差(日期差)
  15. TextRCNN、TextCNN、RNN
  16. Android开发之百度地图定位打卡
  17. Bison 的构成与使用
  18. zData上新丨2000/5000系列数据库一体机带来三重提升
  19. SqlServer2012卸载并重新安装成功完整过程!真的超级激动...
  20. 朴素贝叶斯的三个常用模型:高斯(GaussianNB)、多项式(multinomial model)、伯努利(Bernoulli model)

热门文章

  1. matlab中ga函数的用法,MATLAB中自带遗传算法函数GA的用法
  2. GA001-181-14
  3. 【基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯】
  4. 浅谈面试与简历——总结于尚硅谷视频《程序员面试指南》
  5. Windows 撤销快捷键“ctrl+z“失效解决方法
  6. 被多次定义,第一次再次定义
  7. B站直播的自研P2P实践 | 助力S12英雄联盟总决赛
  8. 如果你学不好架构设计,那你一定没遇到沈剑!
  9. 采用uni-app开发的多端圈子社区论坛系统
  10. 温故知新——五大常用算法总结