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 ...
随机推荐
- redis架构
hash槽16384个,0-16383 master1(slave101,slave102) master2 (slave201,slave202) master 3 (slave30 ...
- 如何在windows和linux搭建django环境
注:本文以python3为例,python2.x是一样的不再赘述 提前准备: python/python3已经安装好,如果没有请参考以下资料进行安装 linux安装python3 win安装pytho ...
- Bugku-CTF之江湖魔头(学会如来神掌应该就能打败他了吧)
Day39 江湖魔头 200 http://123.206.31.85:1616/ 学会如来神掌应该就能打败他了吧
- AcWing 846. 树的重心
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- 路飞-后台Django项目创建
后台:Django项目创建 环境 """ 为luffy项目创建一个虚拟环境 >: mkvirtualenv luffy """ &qu ...
- MySQL 学习(三)事务学习
事务隔离级别 SQL标准的事务隔离级别包括:读未提交(read uncommitted).读提交(read committed).可重复读(repeatable read)和串行化(seria ...
- Java - JVM - 类的生命周期
概述 简述 JVM 里 类的生命周期 上次写了 30%, 居然丢了 难受, 又要重新写 类的生命周期 加载 使用 卸载 1. 加载 概述 类型的加载 大体流程 装载 连接 验证 准备 解析(可选的) ...
- 安装SQL Server 2014(Windows Server 2016)
SQL Server 2014下载地址: 链接:https://pan.baidu.com/s/1FBkdCBeqaIcLMQnUmtfPwg 提取码:6y76 1.使用解压工具解压“cn_sq ...
- django+vue基础框架:django one对one格式
创建app:python manage.py startapp app01(这里的app01是指名字,可以是a或b等等) 生成迁移文件:python manage.py makemigrations ...
- es6二进制数组--基础
一.概念二进制数组由 ArrayBuffer对象 TypeArray 视图和DataView视图 三部分组成是javascript操作二进制数据的一个接口. 早在2011年2月就已经发布,但是由于ES ...