[ HAOI 2010 ] 最长公共子序列
\(\\\)
\(Description\)
求两个长度\(\le5000\)的大写字母串的\(LCS\)长度及个数,定义两\(LCS\)中某一字符在两序列出现位置有一处不同就视为不同。
\(\\\)
\(Solution\)
既然是基于下标不同的LCS那不就可以随便乱搞
求\(LCS\)的时候定义\(f[i][j]\)表示第一个序列处理到第\(i\)个位置,第二个序列处理到第\(j\)个位置时\(LCS\)的长度,类似的定义\(g[i][j]\)为该情况下\(LCS\)的个数。
大力\(DP\)就好,\(f[i][j]\)照常转移,\(g[i][j]\)需要根据转移的情况讨论:
首先若最后得到的答案转移自\(f[i-1][j]\)或\(f[i][j-1]\),那么要加上对应的方案数
若发现\(f[i-1][j-1]=f[i][j]\),证明新加的两个字符都没有用到,而累加了两次,所以要减掉
最后若转移还有\(s1[i]=s2[i]\)的情况,方案数也要对应加上\(f[i-1][j-1]\),注意到这一情况与上一情况必定是不同的,所以无需考虑冲突的部分。
直接开存不下,滚动数组。
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 5010
#define R register
#define gc getchar
#define mod 100000000
using namespace std;
char s1[N],s2[N];
int tot1,tot2,f[2][N],g[2][N];
int main(){
char c=gc();
while(!isupper(c)) c=gc();
s1[tot1=1]=c;
while(isupper(c=gc())) s1[++tot1]=c;
while(!isupper(c)) c=gc();
s2[tot2=1]=c;
while(isupper(c=gc())) s2[++tot2]=c;
g[1][0]=1;
for(R int i=0;i<=tot2;++i) g[0][i]=1;
for(R int i=1,now;i<=tot1;++i){
now=i&1;
for(R int j=1;j<=tot2;++j){
g[now][j]=0;
f[now][j]=max(f[now^1][j],f[now][j-1]);
if(s1[i]==s2[j]) f[now][j]=max(f[now][j],f[now^1][j-1]+1);
if(s1[i]==s2[j]) (g[now][j]+=g[now^1][j-1])%=mod;
if(f[now^1][j]==f[now][j]) (g[now][j]+=g[now^1][j])%=mod;
if(f[now][j-1]==f[now][j]) (g[now][j]+=g[now][j-1])%=mod;
if(f[now^1][j-1]==f[now][j]) (g[now][j]+=mod-g[now^1][j-1])%=mod;
}
}
printf("%d\n%d",f[tot1&1][tot2],g[tot1&1][tot2]);
return 0;
}
[ HAOI 2010 ] 最长公共子序列的更多相关文章
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- DP_最长公共子序列/动规入门
学自:https://open.163.com/movie/2010/12/L/4/M6UTT5U0I_M6V2U1HL4.html 最长公共子序列:(本文先谈如何求出最长公共子序列的长度,求出最长公 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
- LCS(Longest Common Subsequence 最长公共子序列)
最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...
随机推荐
- 什么是js严格模式?
[03] 严格模式 ECMAScript 5 引入了严格模式(strict mode)的概念.严格模式是为JavaScript 定义了一种不同的解析与执行模型.在严格模式下,ECMAScript 3 ...
- h5dnd sortable mutil groups
h5dnd sortable mutil groups https://codepen.io/webgeeker/pen/JmPXaN https://codepen.io/webgeeker/pen ...
- Python学习笔记 (2.2)Python中的字符编码问题及标准数据类型之String(字符串)
Python3中的String类型 首先,Python中没有字符类型,只有字符串类型.单个字符按照长度为1的字符串处理,这对于曾是OIER的我来说有点不适应啊. 字符串的表示方法 最常用的就是用一对双 ...
- POJ 2142 TheBalance 模线性方程求解
题目大意: 就是将两种砝码左右摆放,能够在物品放置在天平上时保持平衡 很容易得到 ax + by = t的模线性方程 按题目要求,希望首先满足 |x| + |y| 最小 , 如果有多种情况,再满足所有 ...
- UVa - 12617 - How Lader
先上题目: How Lader Lader is a game that is played in a regular hexagonal board (all sides equal, all ...
- POJ 1523 SPF 割点 Tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9317 Accepted: 4218 Description C ...
- 两张图让git新手在项目中运用git命令行
创建分支命令: git branch (branchname) 切换分支命令: git checkout (branchname) 当你切换分支的时候,Git 会用该分支的最后提交的快 ...
- unary operator expected
在centos系统从root用户切换到oracle用的时候,总是提示 : -bash- : :[: unary operator expected 能切换成功,就是总提示上面这个, 后来找到原因,在安 ...
- Manthan, Codefest 16 C
建trie树,刚好字符串是反向的,直接在原图上向前搜索就OK了……………… 可怜的我竟然用了RK来hash,在test67那里T了…… 贴个RK的 #include <iostream> ...
- Android自己定义控件系列案例【五】
案例效果: 案例分析: 在开发银行相关client的时候或者开发在线支付相关client的时候常常要求用户绑定银行卡,当中银行卡号一般须要空格分隔显示.最常见的就是每4位数以空格进行分隔.以方便用户实 ...