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 ...
随机推荐
- Hibernate:HIbernate配置详解-HelloWorld
hibernate介绍: Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 它不仅提供了从java类到数 ...
- C编程题总结
最大子序列和: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: ...
- python 小故事1
def test(a:str,b:int)->str: print(test.__annotations__) return a+str(b) def doc_print(): "&q ...
- 【SIKI学院】愤怒的小鸟创建过程-1
第一讲:资源导入,场景的简单搭建 1.创建一个2D工程,用到了3个场景,因此ctrl +S创建场景00-level,ctrl+N保存在你创建的文件夹中,这样一个文件就创建好了,之后继续重复此步骤创建另 ...
- sublime3使用技巧
1.鼠标悬浮,显示文件引用 Preference ——> Settings ——> "index_files": true (保存,重新打开即可) 2 ...
- 如何使用 idea提交svn代码
链接:https://jingyan.baidu.com/article/b2c186c80d81b1c46ff6ff59.html
- Windows使用nmake和Makefile编译c++
今天在本地看到一个lsd_1.6的源文件,不知道什么时候看LSD时下载的,里面只有一个Makefile和源文件. 想到在Linux下可以只用一个make命令就可以得到可执行程序,在Windows下是不 ...
- yii2 password hash生成与验证方法
1.生成 $password是明文.如:123456 $this->password_hash = Yii::$app->security->generatePasswordHash ...
- jmeter实现对Oracle数据库的操作
实现目的 有时候,根据业务需要,可能需要直接对数据库进行性能测试,此时可利用jmeter对Oracle.MySQL等数据库进行相关测试. 脚本实现 添加JDBC Connection Configur ...
- hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)
Hadoop介绍——HA与联邦 0.1682019.06.04 13:30:55字数 820阅读 138 Hadoop 1.0中HDFS和MapReduce在高可用.扩展性等方面存在问题: –HDFS ...