UVA10723 电子人的基因
UVA10723 电子人的基因
题目比较难找附上链接:https://vjudge.net/problem/UVA-10723
题目描述:
给你两个字符串,你需要找出一个最短的字符串,使得两个给定字符串都是找出字符串的子序列
同时,还要找出这个最短的字符串的组成方案有几种。
多组数据,输出格式见样例。
样例输入:
3
ABAAXGF
AABXFGA
ABA
BXA
AABBA
BBABAA
样例输出:
Case #1: 10 9
Case #2: 4 1
Case #3: 8 10
题目分析:
首先不考虑寻找的串最短,只考虑使两个串均为找到的串的自序
那么很显然,我们可以直接将两个给定的字符串拼接起来,得到答案
到了这里,我们可以考虑,在这个拼接的串中,删去一些不必要的字符,来得到最优解
考虑可以删去的字符,一定同时两个串中,位置任意,所以,只要删去两个串的最长公共子序列即可
最优解的字符串长度 = len1 + len2 - len_(lcs(a,b))
考虑维护f[i][j](LCS)的同时维护g[j][j](a串匹配到i位,b串到第j位,最优解的方案数)
转移的时候,f从哪里转移,g必然也从什么地方转移(详见代码)
注:原题面数据丧心病狂卡了读入,两个字符串中存在空格这种东西,不能用scanf,用gets即可
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define RI register int
using namespace std;
typedef long long ll; const int INF = 1e9 + ;
const int MAXN = + ; #define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b)) inline void read(int &x)
{
x = ;
bool flag = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') flag = ;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
x = x * + ch - '';
ch = getchar();
}
if(flag) x *= -;
} int T,len1,len2,t;
char a[MAXN],b[MAXN];
ll f[MAXN][MAXN],g[MAXN][MAXN]; void init()
{
memset(f,,sizeof(f));
memset(g,,sizeof(g));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
//scanf("%s",a + 1);
//scanf("%s",b + 1);
gets(a + );
gets(b + );
len1 = strlen(a + );
len2 = strlen(b + );
} int main()
{
read(T);
while(T --)
{
init();
for(int i = ;i <= max(len1,len2);i ++)
g[i][] = g[][i] = ;
for(RI i = ;i <= len1;i ++)
{
for(RI j = ;j <= len2;j ++)
{
if(a[i] == b[j])
{
f[i][j] = f[i - ][j - ] + ;
g[i][j] += g[i - ][j - ];
}
else
{
f[i][j] = max(f[i - ][j],f[i][j - ]);
if(f[i - ][j] > f[i][j - ])
g[i][j] += g[i - ][j];
else if(f[i - ][j] < f[i][j - ])
g[i][j] += g[i][j - ];
else
g[i][j] += g[i - ][j] + g[i][j - ];
}
}
}
printf("Case #%d: %lld %lld\n",++ t,len1 + len2 - f[len1][len2],g[len1][len2]);
} return ;
}
UVA10723 电子人的基因的更多相关文章
- UVA10723 电子人的基因 Cyborg Genes
题意翻译 [题目描述] 输入两个A~Z组成的字符串(长度均不超过30),找一个最短的串,使得输入的两个串均是它的子序列(不一定连续出现).你的程序还应统计长度最短的串的个数. e.g.:ABAAXGF ...
- UVa 10723 电子人的基因(LCS)
https://vjudge.net/problem/UVA-10723 题意: 输入两个A~Z组成的字符串,找一个最短的串,使得输入的两个串均是它的子序列,另外还需要统计长度最短的串的个数. 思路: ...
- DP题目推荐合集(洛谷/UVa)
今天下午要参加海淀区的比赛了...这几天临时抱佛脚刷了几道DP,正所谓临阵磨枪,不快也光...下面我 就把最近刷到的,自己觉得不错的动态规划题列出来: 1.P2690 接苹果 :(基础二维DP) 2. ...
- 关于基因GO分析的DAVID简单使用
利用DAVID简单的进行GO富集度分析(这里只做简单的分析,即看基因是否存在在GO的三个过程里面) 比如我们有一组要分析的基因:TRPV6 CXADR PROM1 GRAMD2 ...
- 一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)
转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在 ...
- 机器学习&数据挖掘笔记_18(PGM练习二:贝叶斯网络在遗传图谱在的应用)
前言: 这是coursera课程:Probabilistic Graphical Models上的第二个实验,主要是用贝叶斯网络对基因遗传问题进行一些计算.具体实验内容可参考实验指导教材:bayes ...
- Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc 1. #-------常用 游戏类型 1 2. 街机的历史 2 3. #=========== ...
- 寻找与疾病相关的SNP位点——R语言从SNPedia批量提取搜索数据
是单核苷酸多态性,人的基因是相似的,有些位点上存在差异,这种某个位点的核苷酸差异就做单核苷酸多态性,它影响着生物的性状,影响着对某些疾病的易感性.SNPedia是一个SNP调査百科,它引用各种已经发布 ...
- MIT Molecular Biology 笔记5 转录机制
视频 https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...
随机推荐
- 问题总结:mysql和javaweb工程连接的过程中容易产生的问题
问题背景:自己在本机的mysql8瘫痪了,将Oracle中的数据迁移到mysql之后,配置好javaweb工程和虚拟机上的远程Mysql连接的文件之后:遇见了无法访问的问题 具体的配置: dataso ...
- 深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现
一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 fu ...
- dw选择器
选择器并没有一个固定的定义,在某种程度上说,jQuery的选择器和样式表中的选择器十分相似.选择器具有如下特点:1.简化代码的编写2.隐式迭代3.无须判断对象是否存在jQuery 的选择器可谓之强大无 ...
- bugku 点击1000000次
首先看一下题目发现进入网页之后是这个样的 然后点击一下发现是有变化 然后用F12 然后选择post data 然后输入clicks=1000000 然后就会发现答案 (clicks 是点击的意思)
- django项目日志
接口中,写一条日志: 日志工具文件如下:
- 小白科普:Netty有什么用?
随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行. 在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根 ...
- 中国科技股赴美IPO的游戏结束了吗?
编辑 | 于斌 出品 | 于见(mpyujian) 有关斗鱼直播的消息,一直层出不求.最近前几天又有捷报传出,斗鱼走出国门,在美国上市,开始了自己的新征程. 但据悉,斗鱼国际控股有限公司可能刚刚达到外 ...
- C语言字符串类型转换为double浮点数类型
#include <stdio.h>#include <stdlib.h>char *record; double re = atof(record); 使用 atof()函数 ...
- 刷题11. Container With Most Water
一.题目说明 11.Container With Most Water,这个题目难度是Medium. 二.我的做法 乍一看,简单啊,两个for循环就可以了,我在本地写的. #include<io ...
- 在 input 上添加图标字体时无法添加的问题
效果:一个搜索框.如图: 实施过程:一开始,将搜索框分为2部分,用2个 input ,一个 search ,一个 button ,然后给 type="button" 的input ...