给你序列A和B,求出他们LCS的方案数,|A|,|B|<=5000

dp套dp经典题目,我们考虑先求出LCS,令f[i][j]表示处理到序列A的第i位,B序列的第j位时的LCS长度

那么转移很显然,现在考虑如何统计答案

我们设g[i][j]为当处理到序列A的第i位,B序列的第j位时LCS的方案数

显然我们要考虑f[i][j]的转移情况

若f[i][j]=f[i-1][j-1]+1 那么g[i][j]=g[i-1][j-1]

否则我们看f[i][j]是否和f[i-1][j]和f[i][j-1]相等,如果是就分别对应加上g[i-1][j]和g[i][j-1]

注意,若有f[i][j]=f[i-1][j]=f[i][j-1]那么g[i][j]要减去g[i-1][j-1](可以类比于二维前缀和)

答案就是g[n][m]

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 1000000007
using namespace std;
inline void ad(int& x,long long y){ x=(x+y+M)%M; }
int f[5010][5010],g[5010][5010],n,m;
char a[5010],b[5010];
int main(){freopen("lcs.in","r",stdin);freopen("lcs.out","w",stdout);scanf("%s%s",a+1,b+1);n=strlen(a+1); m=strlen(b+1);for(int i=0;i<=n;++i) g[i][0]=1;for(int j=0;j<=m;++j) g[0][j]=1;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1;else f[i][j]=max(f[i-1][j],f[i][j-1]);if(f[i][j]==f[i][j-1]) ad(g[i][j],g[i][j-1]);if(f[i][j]==f[i-1][j]) ad(g[i][j],g[i-1][j]);if(a[i]==b[j]) ad(g[i][j],g[i-1][j-1]);if(f[i-1][j-1]==f[i][j-1]&&f[i-1][j-1]==f[i-1][j]&&f[i][j]==f[i-1][j])ad(g[i][j],-g[i-1][j-1]);}}printf("%d\n%d",f[n][m],g[n][m]);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/7887162.html

Jzoj5237 最长公共子序列相关推荐

  1. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  2. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  3. POJ 3080 多个串最长公共子序列

    求多个串最长公共子序列,字典序最小输出.枚举剪枝+kmp.比较简单,我用find直接查找16ms #include<iostream> #include<string> #in ...

  4. java实现最长连续子序列_最长公共子序列 ||

    问题:在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来,因为最长公共子序列可能不只一种. 难点:输出一个最长公共子序列并不难,难点在于输出所有的最长公共子序列,我们需要在 ...

  5. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  6. 触类旁通,经典面试题最长公共子序列应该这么答

    作者 |  labuladong 来源 | labuladong(ID:labuladong) [导读]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经 ...

  7. 模板 - 最长上升子序列与最长公共子序列

    整理的算法模板合集: ACM模板 目录 1.最长上升子序列(LIS) 1.1树状数组优化O(nlogn)O(nlogn)O(nlogn) 2.最长公共子序列(LCS) 2.1转换成LIS优化O(nlo ...

  8. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)

    目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...

  9. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

最新文章

  1. 近段时间学习html和CSS的一些细碎总结
  2. 解决Wireshark 服务运行于非默认端口问题
  3. java protobuffer 网络_使用Protobuf定义网络协议
  4. MMDetection V2.0:更快更强的通用目标检测平台
  5. C语言入门题-计算到任意日期的总天数
  6. 利用ES6的Generator语法实现自定义iterator
  7. Linux下的基本命令详解,Linux基本命令详解-1.0
  8. Java集合工具类:Collections
  9. 搜狗浏览器中如何删除自带工具 搜狗浏览器删除自带工具的方法步骤
  10. ListT.Find用法学习
  11. 中药说明书实体识别抽取top1
  12. 论文笔记_S2D.18_2019-ICRA_DeepFusion: 基于单视图深度和梯度预测的单目SLAM实时稠密三维重建
  13. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
  14. (转)Rust语言2017年调查报告
  15. 何为全栈工程师?你是否应该成为一名全栈工程师?
  16. Java int 最大值溢出
  17. 将人工智能(AI)应用于软件测试中
  18. 永久免费的数据库防火墙(堡垒机)
  19. 什么是Scheme?原来还可以这样应用!
  20. 网站出现安全证书过期的原因

热门文章

  1. 李秀计算机文化基础,计算机文化基础(李秀)绪论.pptx
  2. 泰拉瑞亚服务器config修改,泰拉瑞亚配置怎么修改_泰拉瑞亚配置修改方法介绍...
  3. 前后落差大用什么词语_语文考题一共有五类:汉字类、词语类、句子类、阅读类、作文类,如果基础扎实,答题技巧弄懂了,哪一类都能拿高分!...
  4. 基于java TCP实现网络通信聊天室《建议收藏附完整源码》
  5. 用计算机探索规律反思,用计算器探索规律教学反思
  6. python登录网页账号密码_遇到需要登录的网站怎么办?学好python,用这3招轻松搞定...
  7. java将异常输出到日志_【ThinkingInJava】25、将异常输出记录到日志
  8. 九年级数学解方程50道_初中数学公式中考知识点总结,初三数学上册,九年级数学上册...
  9. 导入mysql source_mysql导入source数据库
  10. ddos源码 ntp_详解 NTP反射型DDos攻击