洛谷P2516 [HAOI2010]最长公共子序列
题目描述
字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define mod 100000000
#define ll long long
#define re register
using namespace std;
int f[2][5005]={},r[2][5005]={};//必须开滚动数组,不开绝对爆空间,由于动态规划中,一个阶段的决策只受上一个阶段的影响,
//因此可以将以前的状态覆盖掉。只要存两个状态,故只开第一个下标为0~1的二维数组
//r[i][j]存第一个字串前i个(一直被轮换),第二个字串前j个最长子序列的个数
char s1[5005]={},s2[5005]={};
int n,m;
int main()
{
scanf("%s",s1+1);//s1+1代表从s1[1]开始读入数据,s[0]不读入
n=strlen(s1+1)-1;
scanf("%s",s2+1);
m=strlen(s2+1)-1;
re int now=1,pre=0;//这两个变量用来判断两个状态中哪个是以前状态(pre),哪个是现在状态(now)(滚动数组的产物)
for(re int k=0;k<=m;k++)
r[0][k]=1;//初始化,长度为0最长子序列方案数为1(第一个序列长度为0)
r[1][0]=1;//长度为0最长子序列方案数为1(第二个序列长度为0)
for(re int i=1;i<=n;i++)
{
for(re int j=1;j<=m;j++)
{
f[now][j]=max(f[pre][j],f[now][j-1]);
r[now][j]=0;//后面的方案数都是由前面加过来的
if(s1[i]==s2[j])f[now][j]=max(f[now][j],f[pre][j-1]+1);
if(s1[i]==s2[j]&&f[now][j]==f[pre][j-1]+1) r[now][j]+=r[pre][j-1];
if(f[pre][j]==f[now][j]) r[now][j]+=r[pre][j];
if(f[now][j-1]==f[now][j]) r[now][j]+=r[now][j-1];//加上f[i-1][j]和f[i][j-1]中=k的方案数
if(f[pre][j-1]==f[now][j]) r[now][j]-=r[pre][j-1];//如果a[i]!=b[j]且f[i-1][j-1]=k,就要减去它的方案数
r[now][j]=(r[now][j]+mod)%mod;//+mod可以省略
}
now=pre;pre=1-pre;//滚动
}
printf("%d\n%d",f[pre][m],r[pre][m]);
return 0;
}
洛谷P2516 [HAOI2010]最长公共子序列的更多相关文章
- 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ...
- 洛谷 P2516 [HAOI2010]最长公共子序列
题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...
- 洛谷1439:最长公共子序列(nlogn做法)
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...
- 2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组)
2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组) https://www.luogu.com.cn/problem/P2516 题意: 给定字符串 \(S\) ...
- P2516 [HAOI2010]最长公共子序列 题解(LCS)
题目链接 最长公共子序列 解题思路 第一思路: 1.用\(length[i][j]\)表示\(a\)串的前\(i\)个字符与\(b\)串的前\(j\)个字符重叠的最长子串长度 2.用\(num[i][ ...
- luogu P2516 [HAOI2010]最长公共子序列
传送门 首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误) 对以下内容不理解的,强势推荐flash的博客 我们除了原来记录最长上升子序列的\(f_{i,j}\), ...
- Luogu P2516 [HAOI2010]最长公共子序列 DP
首先$LIS$显然:$f[i][j]=max(f[i][j-1],f[i-1][j],(a[i]==b[j])*f[i-1][j-1])$ 考虑如何转移数量: 首先,不管$a[i]$是否等于$b[j] ...
- P2516 [HAOI2010]最长公共子序列
传送门 看到数据范围,显然 $n^2$ 的 $dp$... 设 $f[i][j]$ 表示 $A$ 串考虑了前 $i$ 位,$B$ 串考虑了前 $j$ 位,最优情况下的方案数 但是好像没法判断转移来的是 ...
- [BZOJ2423][HAOI2010]最长公共子序列
[BZOJ2423][HAOI2010]最长公共子序列 试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x ...
随机推荐
- 洛谷——P2054 [AHOI2005]洗牌(扩展欧几里得,逆元)
P2054 [AHOI2005]洗牌 扩展欧拉定理求逆元 $1 2 3 4 5 6$$4 1 5 2 6 3$$2 4 6 1 3 5$$1 2 3 4 5 6$ 手推一下样例,你就会发现是有规律的: ...
- Gym - 101670E Forest Picture (CTU Open Contest 2017 模拟)
题目: https://cn.vjudge.net/problem/1451310/origin 题意&思路: 纯粹模拟. 大体题意是这样的: 1.有人要在一个10-9<=x<=1 ...
- JQurey---新尝试
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- request在作用域中管理属性
request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...
- 00 大王警语--be_a_new_gentleman
大王博客:https://www.cnblogs.com/alex3714/ # 表面层次# 1,着装特体(服饰的牌子中高端)# 2,每天洗澡# 3,适当用香水# 4,女士优先# 5,不随地吐痰.不乱 ...
- BZOJ 4976 [Lydsy1708月赛]宝石镶嵌
[题解] 我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来. 如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过11 ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
- AtCoder Beginner Contest 131 Solution
前言 这次ABC还是有一点难度的吧. TaskA Security Solution 直接模拟就好了. Code /* mail: mleautomaton@foxmail.com author: M ...
- spring boot 的使用(一)
1. 启动spring-boot项目 mvn spring-boot:run cd target java -jar xxxx.jar xxxx代表生成的jar包
- 九度oj 题目1049:字符串去特定字符
题目1049:字符串去特定字符 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:10173 解决:4611 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: ...