【BZOJ2423】最长公共子序列(动态规划)

题面

BZOJ
洛谷

题解

今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz。

对于如何\(O(n^2)\)求解最长的长度是很简单的。
设\(f[i][j]\)表示第一个串匹配到了\(i\),第二个串匹配到了\(j\)的最大长度。
那么转移很显然,要么\(i\)向后挪动一位,要么\(j\)向后挪动一位,要么\(i,j\)匹配上了。
也就是\(f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+1)\),最后一个转移当且仅当\(X[i]=Y[j]\)时才有。

考虑如何统计方案。显然是再记录一个数组\(g[i][j]\)表示到了\(f[i][j]\)时最长长度的方案数。
每次转移的时候如果长度一样则相加。
但是注意一个问题,当转移的时候,发现\(f[i-1][j],f[i][j-1],f[i-1][j-1]\)三者转移是相同的时候,
如果直接统计和的话,那么\(f[i-1][j-1]\)的方案会被重复计算两次,因此需要额外减去。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 100000000
#define ll long long
#define MAX 5005
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int f[2][MAX],g[2][MAX],n,m;
int ans=0,sum=0;
char s[MAX],w[MAX];
int main()
{scanf("%s%s",s+1,w+1);n=strlen(s+1)-1;m=strlen(w+1)-1;for(int i=0;i<=m;++i)g[0][i]=1;for(int i=1,nw=1,pw=0;i<=n;++i,nw^=1,pw^=1){memset(f[nw],0,sizeof(f[nw]));memset(g[nw],0,sizeof(g[nw]));g[nw][0]=1;for(int j=1;j<=m;++j){if(s[i]==w[j])f[nw][j]=f[pw][j-1]+1,g[nw][j]=g[pw][j-1];else f[nw][j]=max(f[nw][j-1],f[pw][j]);if(f[nw][j]==f[nw][j-1])add(g[nw][j],g[nw][j-1]);if(f[nw][j]==f[pw][j])add(g[nw][j],g[pw][j]);if(f[nw][j]==f[pw][j]&&f[nw][j]==f[nw][j-1]&&f[nw][j]==f[pw][j-1])add(g[nw][j],MOD-g[pw][j-1]);}}printf("%d\n%d\n",f[n&1][m],g[n&1][m]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9562518.html

【BZOJ2423】最长公共子序列(动态规划)相关推荐

  1. 【ACM】最长公共子序列 - 动态规划

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长 ...

  2. C语言(CED)最长公共子序列----动态规划第一题

    一.动态规划算法与分治法的异同 相同点: A.二者均是将待求解的问题分成若干子问题来求解. B.二者在编写代码的时候,都要用到递归. 不同点: A.分治法求解的问题,在将问题分成若干子问题之后,其子问 ...

  3. 最长公共子序列-动态规划(C/C++)

    动态规划简述 使用最优子结构特性,动态规划算法采用自底向上的方式计算,在求解的过程中保存已经计算好的子问题的最优解,当子问题的最优解被重复使用时,无需再次计算直接从保存的空间中调用. 举个例子: 斐波 ...

  4. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  5. 最长公共子序列--动态规划(C++)

    动态规划与分治方法类似,都是通过组合子问题来求解原问题.分治法将问题分为互不相交的子问题,递归的求解子问题,再将他们的解组合起来,求出原问题的解.相反的,动态规划用于子问题重叠的情况,即不同的子问题具 ...

  6. 116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长 公共子序列为dp[i][j] 步骤二.推 ...

  7. nyoj36最长公共子序列 动态规划

    题目链接:http://115.159.40.116/problem_show.php?pid=4648 http://acm.nyist.net/JudgeOnline/problem.php?pi ...

  8. 最长公共子序列-动态规划-python

    题目描述 给定一个长度为 N 数组 a 和一个长度为 M 的数组 b. 请你求出它们的最长公共子序列长度为多少. 输入描述 输入第一行包含两个整数 N,M,分别表示数组 a 和 b 的长度. 第二行包 ...

  9. 夕拾算法进阶篇:15)最长公共子序列(动态规划DP)

    题目描述 给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列. 例如:Z=<a,b,f,c>是序列X=<a,b,c ...

  10. bzoj 2423 [HAOI2010]最长公共子序列 动态规划

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

最新文章

  1. php远程开机ubuntu,Ubuntu系统远程开机操作实例
  2. 面试题整理10 最小的k个数
  3. 吴颖二:12.27 午评 地缘政治一波未平一波又起,千三可到?
  4. 男子趁前女友熟睡翻开眼皮,刷脸转走15万!支付宝:几率很小
  5. qt 子窗口写到线程就卡死_Qt多线程创建
  6. hdu1274 展开字符串
  7. XP系统优化超简单实用版
  8. 球缺体积和球冠表面积的计算公式及应用
  9. IJCAI2022论文合集(持续更新中)
  10. SAP 固定资产主数据
  11. android获取uid,Android获得UID的办法
  12. hdu 2222 AC 自动机 模版(数组实现)
  13. PyQt5_pyqtgraph股票RSI指标
  14. NCH Eyeline Video System
  15. 儿时的情怀除了教材的封面和王心凌的《爱你》,还有证件照上的红领巾和马尾辫
  16. 周鸿祎:商业模式不是赚钱模式
  17. 伯明翰高级计算机科学,2020年伯明翰大学高级计算机科学专业本科申请条件及世界排名|学费介绍...
  18. python 生成图表
  19. JSON数据格式(键值对)(一)
  20. mysql重启及机器重启

热门文章

  1. 使用element-ui的el-tree组件
  2. 尚硅谷·网上书城项目(一)
  3. 物联网毕业设计 单片机智能路灯系统
  4. 利用会议软件进行高效会议管理的四大优势
  5. 用计算机怎么弹离人愁数字,关于音乐的4个事实,不懂音乐的人会觉得吃惊,《离人愁》已中招...
  6. EXLCE 一键清除格式
  7. 代码审计入门笔记—分析一个旧版本 espcms SQL 注入漏洞
  8. Centos6.8基本指令
  9. 普通奥运会,文艺奥运会,伦敦奥运会。
  10. Android11 解锁屏幕无反应,Android11 setting中增加永不息屏