http://acm.hdu.edu.cn/showproblem.php?pid=1560

仔细读题(!),则可发现这道题要求的是一个最短的字符串,该字符串的不连续子序列中包含题目所给的所有字符串

因为总共只有40个字符,可以尝试使用A*搜索

1.存储状态时直接存储40个字符,每个字符4种可能是肯定不行的.

因为要求的是包含不连续的子序列,所以只需记住当前字符串长度与每个子序列已经包含在当前字符串的长度,

比如题目中的输入样例

4

ACGT

ATGC

CGTT

CAGT

可以这样存储一个序列

ATG:len=3,s[0]=1,s[1]=3,s[2]=0,s[3]=0,

ATC:len=3,s[0]=2,a[1]=2,s[2]=1,s[3]=1,

又因为只有8个子序列,每个子序列长度不超过5,也就是说可以采用6进制来压缩状态数组.总共不超过6^9=10077696种状态,空间时间都满足

2.评估函数随便选取了当前未实现的最长长度,2483ms过关

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. const int maxsta=10077696;
  7. char str[8][6];
  8. int l[8];
  9. int grade[8][6];
  10. bool vis[maxsta];
  11. int s[8];
  12. int n;
  13. struct status{
  14. int len,f;
  15. int sta;
  16. status():len(0),f(0),sta(0){}
  17. status(int _len,int _f,int _sta):\
  18. len(_len),f(_f),sta(_sta){}
  19. bool operator <(status s2)const {
  20. if(s2.len!=len)return len>s2.len;
  21. return f>s2.f;
  22. }
  23. void tos(){
  24. int tsta=sta;
  25. for(int i=n-1;i>=0;i--){
  26. s[i]=sta%6;
  27. sta/=6;
  28. }
  29. sta=tsta;
  30. }
  31. static int tosta(){
  32. int sta=0;
  33. for(int i=0;i<n;i++){
  34. sta*=6;
  35. sta+=s[i];
  36. }
  37. return sta;
  38. }
  39. static int calcf(int sta){
  40. int tmp[8];
  41. int ans=0;
  42. for(int i=n-1;i>=0;i--){
  43. tmp[i]=sta%6;
  44. sta/=6;
  45. ans=max(ans,l[i]-tmp[i]);
  46. }
  47. return ans;
  48. }
  49. };
  50. priority_queue<status> que;
  51. int ed;
  52. int bfs(){
  53. while(!que.empty())que.pop();
  54. status st=status(0,status::calcf(0),0);
  55. char ch[4]={'A','G','C','T'};
  56. que.push(st);
  57. vis[0]=true;
  58. while(!que.empty()){
  59. status tp=que.top();que.pop();
  60. if(tp.sta==ed)return tp.len;
  61. for(int i=0;i<4;i++){
  62. tp.tos();
  63. for(int j=0;j<n;j++){
  64. if(ch[i]==str[j][s[j]]){
  65. s[j]++;
  66. }
  67. }
  68. int tmpsta=status::tosta();
  69. if(vis[tmpsta])continue;
  70. vis[tmpsta]=true;
  71. if(tmpsta==ed)return tp.len+1;
  72. que.push(status(tp.len+1,status::calcf(tmpsta),tmpsta));
  73.  
  74. }
  75.  
  76. }
  77. return -1;
  78. }
  79.  
  80. int main(){
  81. int T;
  82. scanf("%d",&T);
  83. while(T--){
  84. scanf("%d",&n);
  85. memset(vis,0,sizeof(vis));
  86. for(int i=0;i<n;i++){
  87. scanf("%s",str[i]);
  88. l[i]=strlen(str[i]);
  89. s[i]=l[i];
  90. }
  91. ed=status::tosta();
  92. int ans=bfs();
  93. printf("%d\n",ans);
  94. }
  95. return 0;
  96. }

HDU 1560 DNA sequence A* 难度:1的更多相关文章

  1. HDU 1560 DNA sequence(DNA序列)

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

  2. hdu 1560 DNA sequence(搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others)  ...

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

    DNA sequence Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  4. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

  5. HDU 1560 DNA sequence(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题目大意:给出n个字符串,让你找一个字符串使得这n个字符串都是它的子串,求最小长度. 解题思路: ...

  6. HDU 1560 DNA sequence (迭代加深搜索)

    The twenty-first century is a biology-technology developing century. We know that a gene is made of ...

  7. HDU - 1560 DNA sequence

    给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...

  8. HDU 1560 DNA sequence DFS

    题意:找到一个最短的串,使得所有给出的串是它的子序列,输出最短的串的长度,然后发现这个串最长是40 分析:从所给串的最长长度开始枚举,然后对于每个长度,暴力深搜,枚举当前位是哪一个字母,注意剪枝 注: ...

  9. POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)

    曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...

随机推荐

  1. 手机CPU知识扫盲:谈谈手机CPU架构与原理 (全

    CPU是手机上面最复杂,最贵的Soc(芯片),担任的也是手机中大脑的位 置,是手机跑分性能的决定性硬件.智能手机发展到今天,各大手机CPU厂商也从春秋战国逐渐到了现在四国鼎立的时代(高通,MTK,三星 ...

  2. java中String的常用方法

    java中String的常用方法1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len= ...

  3. 在Windows上安装MySQL5.7

    1. 下载安装包,这里选择压缩版mysql-5.7.16-winx64.zip: http://dev.mysql.com/downloads/mysql/ 2. 解压到安装目录,注意最好不要含有中文 ...

  4. 【夯实Mysql基础】记一次mysql语句的优化过程!

      1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同 ...

  5. JS---------->数组练习!

      var arr = [4, 0, 7, 9, 0, 0, 2, 6, 0, 3, 1, 0]; 要求将数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组 <!doctype htm ...

  6. jQuery中其他

    hide:  隐藏 $('img').hide(); show:显示 $('img').show(); 单选多选下拉菜单 选中状态checked ($('.radio:checked')); 单选 ( ...

  7. 基于OGG的Oracle与Hadoop集群准实时同步介绍

    版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/220 来源:腾云阁 https://www.qclou ...

  8. 编译maxscale

    编译maxscale,需要依赖mariadb版本的MySQL.有自己的版本就是任性啊

  9. java中运算符的解析和计算

    package com.LBH; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import j ...

  10. linux笔记:网络命令ping,traceroute,ifconfig,netstat;挂载和卸载命令mount,umount

    命令名称:ping功能:测试网络连通性命令所在路径:/bin/ping用法:ping [-c] IP地址参数:-c 指定发送次数 命令名称:ifconfig功能:查看和设置网卡信息(临时设置)命令所在 ...