程序设计实习2015年期末考试 E.DNA(状态压缩dp+特殊处理+预处理)

该博客讨论了一道程序设计实习题目,涉及DNA单链的最短长度计算。通过状态压缩动态规划解决,同时需要特殊处理和预处理来确保正确性。作者在遇到困难后反思并找到了解决问题的关键,即判断新基因片段是否被前面的片段包含,避免错误的组合。
摘要由CSDN通过智能技术生成

程序设计实习2015年期末考试 E.DNA(状态压缩+特殊处理+预处理)
总时间限制: 6000ms 内存限制: 1024kB

描述
考虑一段DNA单链,上面有N个基因片段。这里的基因片段可重叠(例如AGCTC包含AGC和CTC),不可倒置(例如AGCTC不包含TCG)。要问这样的单链最短长度是多少。

输入
输入的第一行是一个正整数T(不超过13),表示数据组数。每组数据若干行,其中第一行一个正整数N(不超过9),表示基因片段的数目,接下来N行每行一个基因片段,由AGCT四个字母组成,且长度介于1和15之间(含两端)。

输出
每组数据输出一样,表示最短的单链长度包含这N个基因片段。

样例输入

1
5
TCGG
GCAG
CCGC
GATC
ATCG

样例输出

11


这个题一看到就想到状态压缩dp,但是光组成状态这一个维度是不够的,因为同一个状态由于排列不同添加一个DNA片段代价不一样,所以我第一反应添加了另外一个维度——结尾的字符串。但是WA,当时想到一个问题,万一最后一个DNA片段长得一个片段解决不了要多个呢,那么这个状态压缩岂不是得改成dfs了,心凉了半截,改为dfs,TLE。陷入了死胡同。
其实,我之所以状态压缩也许只是我觉得似乎是状态压缩,并没有自己的思考,我连上一个问题都没想明白就开始写,就算对了也是瞎蒙的。痛定思痛想了想,想明白了这个问题:
如果在ABC这个串后面加了一个D,D在BC内是一个子片段,虽然算不出正确结果,但是由于必然计算过AB+D+C=ABC这一形式的状态压缩dp局部解,所以ABC+D这个错误解答不会影响。但是,如果D是C的一个子片段,那么问题就很产生了,为了避免这个错误,要特殊处理,读入一个片段后判断是否被前面的串包含,包含则删去,这样算法才具有了正确性。
特殊处理后本题算法就有了正确性保证,预处理dis[i][j]表示i后接上j可以重叠长度。一个小技巧,合理调用< string.h>内的库函数strstr()可以节省查找子串代码量,性能也不差。

Accepted    260kB   0ms 1527 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值