【BZOJ2423】最长公共子序列(动态规划)
【BZOJ2423】最长公共子序列(动态规划)
题面
题解
今天考试的时候,神仙出题人\(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;
}
【BZOJ2423】最长公共子序列(动态规划)的更多相关文章
- 【ACM】最长公共子序列 - 动态规划
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- C++求解汉字字符串的最长公共子序列 动态规划
近期,我在网上看了一些动态规划求字符串最长公共子序列的代码.可是无一例外都是处理英文字符串,当处理汉字字符串时.常常会出现乱码或者不对的情况. 我对代码进行了改动.使用wchar_t类型存储字 ...
- nyoj 36-最长公共子序列 (动态规划,DP, LCS)
36-最长公共子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:18 submit:38 题目描述: 咱们就不拐弯抹角了,如题,需要你做的就是写 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 动态规划 - 最长公共子序列(LCS)
最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...
- [BZOJ2423][HAOI2010]最长公共子序列
[BZOJ2423][HAOI2010]最长公共子序列 试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x ...
- 算法导论-动态规划(最长公共子序列问题LCS)-C++实现
首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2 ,..., xm>,另一个序列Z =<z1,z2 ...
随机推荐
- Linux命令的那些事(一)
回顾一下前文,三大主流操作系统 windows做的最好(更准确最早做图形化界面是windows)其实是图形化界面占有90%的市场份额(PC(个人电脑)机的市场)但是现在发展图形界面做的较好其实Unix ...
- 记录一个IIS的服务器错误问题的解决方案
部署一个mvc项目到iis的时候提示有下面这样的错误, 看提示是Microsoft.CodeDom.Providers.DotNetCompilerPlatform,权限问题. 我是第一次遇到,所以只 ...
- MyCat安装与测试教程 超详细!
MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...
- 从Web抓取信息的几个常用方法
1.Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok. 2.raise_for_status()方法是一种很好的方式,确保程序在下载失败 ...
- Hyperledger Fabric 中channel配置相关数据结构
channel Configuration Transaction Hyperledger Fabric区块链网络中的配置存储在一个configuration-transaction的集合中,每个ch ...
- python3使用csv包,读写csv文件
python操作csv,现在很多都用pandas包了,不过python还是有一个原始的包可以直接操作csv,或者excel的,下面举个例子说明csv读写csv文件的方法: import os impo ...
- TeamWork#3,Week5,Scrum Meeting 11.15
经过最近一段时间的努力,我们调整了爬虫结构,并在继续进行爬虫开发,马上可以进行新爬虫与服务器连接的测试. 成员 已完成 待完成 彭林江 基本完成爬虫结构调整 新爬虫与服务器连接 郝倩 基本完成爬虫结构 ...
- Daily scrum 2015.10.19
这周是我们团队项目开始的第一周.我们的团队项目是“北航社团平台”,一个致力于打造北航社团资讯整合.社团工作服务与社团商品销售的一站式网络平台. 一.会议内容 1. 总体分工,江昊同学担任项目PM,王若 ...
- java 线程的简单理解
想要实现线程可以继承Thread也可以实现接口runnable,在类中重写 run()方法在主函数调用start方法就可以开辟线程. 对于java对象都有一个wait()和notify().notif ...
- golang type
参考链接 https://blog.csdn.net/tzs919/article/details/53571632 type是golang中非常重要的关键字,常见的就是定义结构体,但是其功能远不止是 ...