luogu P2516 [HAOI2010]最长公共子序列
首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误)
对以下内容不理解的,强势推荐flash的博客
我们除了原来记录最长上升子序列的\(f_{i,j}\),再记\(g_{i,j}\)表示到\(i,j\)时的最长上升子序列个数,同时设两个字符串为\(A,B\)
若\(A_i=B_j\) ,则有\(f_{i,j}=f_{i-1,j-1}+1,g_{i,j}=g_{i-1,j-1}\)
否则\(f_{i,j}=max(f_{i-1,j},f_{i,j-1}),g_{i,j}\)的话看能否从\(f_{i-1,j}\)或\(f_{i,j-1}\)转移,如果可以就加上对应的\(g\)
注意,如果\(f_{i,j}=f_{i-1,j-1}\)(等价于\(f_{i,j}=f_{i-1,j}=f_{i,j-1}\)),那么\(g_{i-1,j-1}=g_{i-1,j}=g_{i,j-1}=\frac{1}{2}g_{i,j}\),所以要减去\(g_{i-1,j-1}\)
至于为什么,yyb都没写,我也不好说.,反正要么感性理解(雾),要么打表手玩.还不理解就戳flash吧qwq
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=5000+10,mod=100000000;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int f[2][N],g[2][N],n,m;
char cc[N],ss[N];
int main()
{
scanf("%s%s",cc+1,ss+1);
n=strlen(cc+1)-1,m=strlen(ss+1)-1;
g[0][0]=g[1][0]=1;
for(int j=1;j<=m;j++) g[0][j]=1;
int nw=1,la=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[nw][j]=g[nw][j]=0;
if(cc[i]==ss[j]) f[nw][j]=f[la][j-1]+1,g[nw][j]=g[la][j-1];
else f[nw][j]=max(f[nw][j-1],f[la][j]);
if(f[nw][j]==f[la][j]) g[nw][j]+=g[la][j];
if(f[nw][j]==f[nw][j-1]) g[nw][j]+=g[nw][j-1];
if(f[nw][j]==f[la][j-1]) g[nw][j]-=g[la][j-1];
g[nw][j]%=mod;
}
swap(nw,la);
}
printf("%d\n%d\n",f[la][m],g[la][m]);
return 0;
}
luogu P2516 [HAOI2010]最长公共子序列的更多相关文章
- 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] ...
- 2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组)
2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组) https://www.luogu.com.cn/problem/P2516 题意: 给定字符串 \(S\) ...
- 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ...
- 洛谷 P2516 [HAOI2010]最长公共子序列
题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...
- P2516 [HAOI2010]最长公共子序列 题解(LCS)
题目链接 最长公共子序列 解题思路 第一思路: 1.用\(length[i][j]\)表示\(a\)串的前\(i\)个字符与\(b\)串的前\(j\)个字符重叠的最长子串长度 2.用\(num[i][ ...
- 洛谷P2516 [HAOI2010]最长公共子序列
题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- P2516 [HAOI2010]最长公共子序列
传送门 看到数据范围,显然 $n^2$ 的 $dp$... 设 $f[i][j]$ 表示 $A$ 串考虑了前 $i$ 位,$B$ 串考虑了前 $j$ 位,最优情况下的方案数 但是好像没法判断转移来的是 ...
- [BZOJ2423][HAOI2010]最长公共子序列
[BZOJ2423][HAOI2010]最长公共子序列 试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x ...
- 【BZOJ2423】[HAOI2010]最长公共子序列 DP
[BZOJ2423][HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- 激活win10专业版
每180天激活一次
- share.js轻松分享/邀请
GitHub地址 https://github.com/overtrue/share.js 安装 安装的方法很多,大家选择自己合适的进行安装就好. clone $ git clone https:// ...
- ecplise tomcat忽然出现404
场景:之前用的好好的,eclipse可以启动,然后浏览器访问 localhost:8080 出现tomcat 404 页面 解决方法:删掉server ,重新建个 server
- 自学Linux Shell14.3-创建临时文件
点击返回 自学Linux命令行与Shell脚本之路 14.3-创建临时文件mktemp Linux系统保留了一个特殊的目录位置,以供临时文件使用.Linux使用/tmp目录处理不需要永久保存的文件. ...
- 51Nod 1048 1383 整数分解为2的幂
任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量! 比如N = 7时,共有6种划分方法. 7=1+1+1+1+1+1+1 =1+1+1+1+1+2 =1+1+1+2+2 ...
- 洛谷 P2725 邮票 Stamps 解题报告
P2725 邮票 Stamps 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描 ...
- 洛谷 画栅栏Painting the Fence 解题报告
P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...
- HDU 1176 免费馅饼 (动态规划)
HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...
- LOJ#2320 生成树计数
解:讲一个别的题解里我比较难以理解的地方,就是为什么可以把这两个东西合起来看成某一个连通块指数是2m而别的指数都是m. 其实很好理解,但是别人都略过了......把后面的∑提到∏的前面,然后展开,也可 ...
- A1010. Radix
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...