博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 10723 Cyborg Genes(LCS变种)
阅读量:4589 次
发布时间:2019-06-09

本文共 1766 字,大约阅读时间需要 5 分钟。

题意:

每组测试数据有两个DNA,目标串为能保持两个给出的DNA的相对序列且为最小长度的串,并且要输出有多少种构造方法。

思路:

对于求最小串的长度,就很简单了,把LCS的思想直接移植过来就行了:

1. b1[i] == b2[j]  d1[i, j] = d1[i-1, j-1];

2. b1[i] != b2[j]  d1[i, j] = min(d1[i-1, j], d1[i, j-1]) + 1;

对于求有多少种组合方法,定义d2[i, j]表示两个串的前i, j个有多少个组合方法。

1. b1[i] == b2[j]  显然b1[i] b2[j]在最后的摆放次序已经无关了,d2[i, j] = d2[i-1, j-1];

2. b1[i] != b2[j]  此时就要详细讨论了d1[i, j-1]与d1[i-1, j]的大小关系,关系着b1[i], b2[j]在最后的摆放次序。

 

#include 
#include
#include
#include
#include
using namespace std;const int MAXN = 50;int d1[MAXN][MAXN], d2[MAXN][MAXN];char b1[MAXN], b2[MAXN];int main(){ int cases, count = 0; scanf("%d%*c", &cases); while (cases--) { gets(b1 + 1); gets(b2 + 1); for (int i = 0; i < MAXN; ++i) d1[0][i] = d1[i][0] = i, d2[0][i] = d2[i][0] = 1; int len1 = strlen(b1 + 1); int len2 = strlen(b2 + 1); for (int i = 1; i <= len1; ++i) for (int j = 1; j <= len2; ++j) if (b1[i] == b2[j]) { d1[i][j] = d1[i-1][j-1] + 1; d2[i][j] = d2[i-1][j-1]; } else { d1[i][j] = min(d1[i-1][j], d1[i][j-1]) + 1; if (d1[i-1][j] < d1[i][j-1]) d2[i][j] = d2[i-1][j]; else if (d1[i-1][j] > d1[i][j-1]) d2[i][j] = d2[i][j-1]; else d2[i][j] = d2[i-1][j] + d2[i][j-1]; } printf("Case #%d: %d %d\n", ++count, d1[len1][len2], d2[len1][len2]); } return 0;}

 

 

 

 

转载于:https://www.cnblogs.com/kedebug/archive/2012/11/25/2787868.html

你可能感兴趣的文章
excel如何用公式判断单元格的值是否为数字、英文、中文,以及相应的计数
查看>>
软件协作工具Trello
查看>>
快速搭建windows服务器的可视化运维环境
查看>>
java多线程读取、操作List集合
查看>>
Jboss EAP 6 EJB调用常见问题
查看>>
SQL优化 查询语句中,用 inner join 作为过滤条件和用where作为过滤条件的区别
查看>>
mongodb入门
查看>>
猫眼电影top100抓取
查看>>
【codeforces】【比赛题解】#862 CF Round #435 (Div.2)
查看>>
SpringCloud学习笔记(8)----Spring Cloud Netflix之负载均衡-Ribbon的负载均衡的策略
查看>>
并发编程学习笔记(3)----synchronized关键字以及单例模式与线程安全问题
查看>>
2-9
查看>>
python多线程(一)
查看>>
MindManager中读图工具的使用
查看>>
利用GridView 插入、删除、修改、分页的综合实例代码---转!!!
查看>>
2016年3月11日Android学习日记
查看>>
Android弹出Toast工具类总结
查看>>
吴恩达机器学习笔记(十) —— 推荐系统
查看>>
Linux下Ant安装与配置
查看>>
实验二 用机器指令和汇编指令编程
查看>>