洛谷 P2516 [HAOI2010]最长公共子序列
题目传送门
解题思路:
第一问要求最长公共子序列,直接套模板就好了.
第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量
如果f[i][j]是由f[i-1][j]转移过来的,那么ans[i][j] += ans[i-1][j].
如果是从f[i][j-1]或f[i-1][j-1]转移过来的,同上(数组下标变化).
如果f[i][j] == f[i-1][j-1],那么说明f[i-1][j]和f[i][j-1]是从f[i-1][ij-1]转移过来的,那么ans[i][j]就把ans[i-1][j-1]加了两遍,要减去一遍.
还有就是题目中两个字符串的长度都不超过5000,如果直接暴力,会MLE.
那么,这个时候,我们的滚动数组就派上用场了.
最后说明一点,ans的初始值怎么附: 我是设第一次的i为0,那么ans[0][0] = 1,因为长度为1的A和长度为0的B的最长公共子序列有1个.
ans[1][所有] = 1;因为长度为0的A和任意长度的B最长公共子序列的个数都是1.
AC代码:
#include<iostream>
#include<cstdio> using namespace std; const int mod = ;
string l,l1;
int f[][],ans[][],m; inline int max(int a,int b) {
if(a >= b) return a;
return b;
} int main() {
cin >> l >> l1;
for(int i = ;i <= l1.length() - ; i++)
ans[][i] = ;
ans[][] = ;
for(int i = ;i <= l.length() - ; i++) {
for(int j = ;j <= l1.length() - ; j++) {
f[m][j] = max(f[m][j-],max(f[m^][j],f[m^][j-] + (l[i-] == l1[j-])));
ans[m][j] = ;
if(f[m][j] == f[m^][j]) ans[m][j] += ans[m^][j];
if(f[m][j] == f[m][j-]) ans[m][j] += ans[m][j-];
if(f[m][j] == f[m^][j-] + && l[i-] == l1[j-]) ans[m][j] += ans[m^][j-];
if(f[m][j] == f[m^][j-]) ans[m][j] -= ans[m^][j-];
ans[m][j] = ans[m][j] % mod;
}
m = m ^ ;
}
printf("%d\n%d",f[m^][l1.length()-],ans[m^][l1.length()-]);
return ;
}
洛谷 P2516 [HAOI2010]最长公共子序列的更多相关文章
- 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ...
- 洛谷P2516 [HAOI2010]最长公共子序列
题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- 洛谷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 ...
随机推荐
- vs2015中安装cplex攻略以及解决丢失cplex.dll问题
转:http://blog.sina.com.cn/s/blog_61f0374801014swp.html 按:相信配置过CPLEX的人大多有过痛苦而难忘的经历,本人亦不例外,纠结挣扎了一个下午加一 ...
- du与df的区别
我们知道,磁盘的整体数据是记录在superblock中的,但是每一个文件的容量信息则在inode当中记载的.因此,引出了两个查看这些数据信息的命令: df:列出文件系统的整体磁盘使用量.由于df主要读 ...
- NO23 Linux正则表达式结合三剑客企业级实践--取IP
企业实践: 一.取IP的方法(用三剑客): grep: awk: sed:虽有三种,但是思路是一样的,用到正则有些表达细节不一样而已. 分析: sed***: 课堂试题: |sed -nr 's#^. ...
- Django 利用第三方平台实现用户注册
前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...
- 安装双版本python2 和 python 3 所产生得问题 解决yum对python依赖版本问题
错误 解决办法 一是升级yum 直接使用python3以上版本 二是修改yum的解释器为旧版本python2.7,即将连接文件 /usr/bin/python 软连接回 /usr/bi ...
- REVISITING FINE-TUNING FOR FEW-SHOT LEARNING
https://arxiv.org/pdf/1910.00216.pdf 明天看
- VUE - 取消默认事件
1,在 methods 中 <template> <div> <form @submit="addTodo"> ...
- nodejs 编译时对项目进行配置
1.启动项目设置配置信息 2.读取项目配置文件 3.根据配置的文件读取自定义属性 4.根据相关属性配置其他差异 5.其他
- [Luogu][P2458] [SDOI2006]保安站岗
题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...
- 118.django中表单的使用方式
表单 HTML中的表单: 从前端来说,表单就是用来将数据提交给服务器的,不管后台使用的是django还是php等其他的语言.只要把input标签放在form标签中,然后再添加一个提交的按钮,就可以将i ...