UVa 10723 LCS变形 Cyborg Genes
题解转自:
UVA 10723 Cyborg Genes - Staginner - 博客园
首先这个题目肯定是按最长公共子序列的形式进行dp的,因为只有保证消去的一部分是最长公共子序列才能保证最后生成的序列最短。
因此,在记录方案数的时候我们也按最长公共子序列的生成过程来记录即可,我们不妨用p[i][j]记录最长公共子序列的字符数,用f[i][j]表示到第一个字符串第i个位置、第二个字符串第j个位置时生成的序列最短的方案种数。
当a[i]!=b[j]时,p[i][j]=max{p[i-1][j],p[i][j-1]},那么如果p[i][j]==p[i-1] [j],f[i][j]+=f[i-1][j],如果p[i][j]==p[i][j-1],f[i][j]+=f[i][j-1]。用文字翻译过来就是 说因为a[i]和b[j]是不同的,所以f[i][j]等于以a[i]结尾的最短的字符串的方案种数,加上以b[j]结尾的最短的字符串的方案种数。
当a[i]==b[j]时,p[i][j]=p[i-1][j-1]+1,f[i][j]+=f[i-1][j-1]。试想,我们这样算会不会少算某些部 分呢?因为毕竟也可以在a[i]和b[j]不配成一对的情况下生成最短的字符串呀。实际上,是可以证明f[i-1][j-1]包含了上述的情况的。譬如我 们假设b[j]和a[i]前面的某个字符配成一对,同时生成了最短的字符串,那么这个字符串必然是以a[i]结尾的某个最短字符串,而以a[i]结尾的所 有最短字符串的个数显然已经包含在f[i-1][j-1]之中了,因为f[i-1][j-1]本身就表示的是以a[i]为结尾的最短字符串的方案总数。
实际上,这个类似证明求最长公共子序列时如果a[i]==b[j],那么取p[i][j]=p[i-1][j-1]+1一定是最优的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ; char s1[maxn], s2[maxn];
int d[maxn][maxn];
long long f[maxn][maxn]; int main()
{
int T; scanf("%d", &T); getchar(); for(int kase = ; kase <= T; kase++)
{
gets(s1 + );
gets(s2 + );
int len1 = strlen(s1 + ), len2 = strlen(s2 + );
memset(d, 0x3f, sizeof(d));
memset(f, , sizeof(f));
for(int i = ; i <= len1; i++) d[i][] = , f[i][] = ;
for(int i = ; i <= len2; i++) d[][i] = , f[][i] = ; for(int i = ; i <= len1; i++)
for(int j = ; j <= len2; j++)
{
if(s1[i] == s2[j])
{
d[i][j] = d[i-][j-] + ;
f[i][j] = f[i-][j-];
}
else
{
d[i][j] = max(d[i][j-], d[i-][j]);
if(d[i-][j] == d[i][j]) f[i][j] += f[i-][j];
if(d[i][j-] == d[i][j]) f[i][j] += f[i][j-];
}
} printf("Case #%d: %d %lld\n", kase, len1 + len2 - d[len1][len2], f[len1][len2]);
} return ;
}
代码君
UVa 10723 LCS变形 Cyborg Genes的更多相关文章
- 10723 Cyborg Genes (LCS + 记忆化搜索)
Problem F Cyborg Genes Time Limit 1 Second September 11, 2132. This is the day that marks the beginn ...
- uva 10723
10723 - Cyborg Genes Time limit: 3.000 seconds Problem F Cyborg Genes Time Limit 1 Second Septembe ...
- UVa10723 - Cyborg Genes
这题我能想到的解决方法是: 最优解的长度好找,两串的长度和-LCS: 根据anslen,枚举出解的数目...但想不出简单有效的枚举方法,这种做法可能超时 网上看大神的博客后,发现大家都用的此方法: 最 ...
- POJ 1080( LCS变形)
题目链接: http://poj.org/problem?id=1080 Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K ...
- poj 1080 (LCS变形)
Human Gene Functions 题意: LCS: 设dp[i][j]为前i,j的最长公共序列长度: dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j]) dp[i ...
- UVA-1625-Color Length(DP LCS变形)
Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的 ...
- uva 10723 Cyborg Genes(LCS变形)
题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=107450#problem/C 题意:输入两个字符串,找一个最短的串,使得输入的两个 ...
- UVa 10723 Cyborg Genes (LCS, DP)
题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么 ...
- UVA - 10723 Cyborg Genes (LCS)
题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果s[i-1]==t[j-1]就有dp[i][j] = dp[i-1][j ...
随机推荐
- Java基础:(二)String字符串
一.String概述 String被声明为final,因为它不可被继承. 内部使用char数组存储数据,该数组被声明为final,这意味着value数组初始化之后就不能再引用其他数组.并且String ...
- jsonp, json区别
JSONP由两部分组成: 回调函数和数据 回调函数是接收到响应时应该在页面中调用的函数,其名字一般在请求中指定. 数据是传入回调函数中的JSON数据. jsonp var script=documen ...
- Golang的开发环境配置之SlickEdit篇
Golang的开发环境通常有如下三种: 1. vi, emacs, notepad++ 2. Sublime Text 2/3 3. LiteIDE 不过,今天我想体验一下在slickedit当中使用 ...
- 深度探索C++对象模型——关于对象
引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...
- 编写sql查询语句思路
编写查询语句思路/* 1.首先确定最终输出结果的列,包括几个方面:A.首先这些列来自于一个 表.还是多个表,如果是多个表则可能用到多表查询的(等值连接.不等值 连接.外连接.自连接):B.这些列是直接 ...
- 新手第一天学习 C#语言(进制互换)
说起来我们对一些陌生或者未知的东西有一些恐惧感,但是又有一些期待,虽然我不确定自己能不能学会这门语言,但是我会尽自己最大的努力学. 我们第一天学的的内容呢,对大多数的人都知道,计算机的语言是二进制,但 ...
- Firefox火狐广告过滤插件Adblock Plus过滤规则包[中文维护小组]
如果你经常使用Firefox火狐浏览器那么一定知道Adblock Plus这款广告过滤插件,功能非常强大,但是Adblock Plus广告过滤插件自带的过滤规则并不多,而且也不太适合我们中国的网站,在 ...
- 3. Netbackup 7.6客户端的安装(windows/linux)
1 客户端的安装 1.1 Windows客户端安装 1.1.1 客户端hosts修改 windows xp/2003/vista/2008/7/8用户HOSTS文件是在“c:\windows\syst ...
- [torch] torch.contiguous
torch.contiguous 作用 连续存储,因为view的操作要求的是连续的内容. 详细 考虑下面的操作,transpose操作只是改变了stride,而实际数组存储的内容并没有得到任何改变,即 ...
- 查看nvidia的GPU
nvidia-smi就可以查看,可以看到进程的占用率,可以kill杀掉进程 注意这里的-前后都不要空格,连起来写