题解转自:

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的更多相关文章

  1. 10723 Cyborg Genes (LCS + 记忆化搜索)

    Problem F Cyborg Genes Time Limit 1 Second September 11, 2132. This is the day that marks the beginn ...

  2. uva 10723

      10723 - Cyborg Genes Time limit: 3.000 seconds Problem F Cyborg Genes Time Limit 1 Second Septembe ...

  3. UVa10723 - Cyborg Genes

    这题我能想到的解决方法是: 最优解的长度好找,两串的长度和-LCS: 根据anslen,枚举出解的数目...但想不出简单有效的枚举方法,这种做法可能超时 网上看大神的博客后,发现大家都用的此方法: 最 ...

  4. POJ 1080( LCS变形)

    题目链接: http://poj.org/problem?id=1080 Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K ...

  5. 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 ...

  6. UVA-1625-Color Length(DP LCS变形)

    Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的 ...

  7. uva 10723 Cyborg Genes(LCS变形)

    题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=107450#problem/C 题意:输入两个字符串,找一个最短的串,使得输入的两个 ...

  8. UVa 10723 Cyborg Genes (LCS, DP)

    题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么 ...

  9. UVA - 10723 Cyborg Genes (LCS)

    题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果s[i-1]==t[j-1]就有dp[i][j] = dp[i-1][j ...

随机推荐

  1. Linux netstat命令详解和使用例子(显示各种网络相关信息)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...

  2. rest_framework组件之认证,权限,访问频率

    共用的models from django.db import models # Create your models here. class User(models.Model): username ...

  3. C++拾遗(五)——类

    类是 C++ 中最重要的特征.C++ 语言的早期版本被命名为“带类的 C(Cwith Classes)”,以强调类机制的中心作用.随着语言的演变,创建类的配套支持也在不断增加.语言设计的主要目标也变成 ...

  4. (四)我的JavaScript系列:原型链

    夜深风竹敲秋韵,万叶千声皆是恨. 原型链对于JavaScript来说是个很核心的概念.JavaScript不是基于类模板的面向对象语言:反而,它的面向对象机制是基于原型的.我们不可能说某个对象属于什么 ...

  5. 编写sql查询语句思路

    编写查询语句思路/* 1.首先确定最终输出结果的列,包括几个方面:A.首先这些列来自于一个 表.还是多个表,如果是多个表则可能用到多表查询的(等值连接.不等值 连接.外连接.自连接):B.这些列是直接 ...

  6. html 获取和写入cookie的 方法

    //取Cookie的值            function getCookie(cookie_name) {     var allcookies = document.cookie;     v ...

  7. nginx只允许域名访问网址,禁止ip访问

    修改nginx配置 文件 在server段里插入如下正则: if ( $host != 'www.baidu.com') { return 403; } 说明:如果访问讨还不是www.baidu.co ...

  8. vue 中根据地址名称获取实际经纬度方法

    <div id="container" class="map" style="margin-top:30px; width: 1200px;he ...

  9. 2018.3.4 Linux and Unix 知识点

    UNIX系统的特点 1.多任务 2.多用户 3.强大的网络功能 4.设备无关性 5.并行处理能力 6.开放性 7.错误处理 Linux系统的特点 1.自由软件 2.良好的兼容性 3.良好的界面 4.丰 ...

  10. linux基本命令及使用方法

    shell环境: shell:命令解释器,是Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行. bash:是GNU 计划中重要的工具软件之一 ...