【bzoj2423】最长公共子序列[HAOI2010](dp)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2423
题目大意:求两个字符串的最长公共子序列长度和最长公共子序列个数。
这道题的话,对于神犇来说,肯定是一眼看出状态转移方程的。而我这个蒟蒻,看了几篇博客之后才看懂。。。
第一问模板lcs,大家肯定都会,就是设f[i][j]为A串跑到第i位,B串跑到第j为时的最长公共子序列长度,然后就有:
f[i][j]=f[i-1][j-1]+1 (a[i]==b[j])
=max(f[i-1][j],f[i][j-1]) (a[i]!=b[j]) (原谅我不会编辑公式)
我就解释一下第二问的方程。先设g[i][j]为A串跑到第i位,B串跑到第j为时的最长公共子序列个数,方程就是这样:
g[i][j]=g[i-1][j-1]
+g[i-1][j] (f[i][j]==f[i-1][j])
+g[i][j-1] (f[i][j]==f[i][j-1])
(a[i]==b[j])
=g[i-1][j] (f[i][j]==f[i-1][j])
+g[i][j-1] (f[i][j]==f[i][j-1])
-g[i-1][j-1] (f[i][j]==f[i-1][j-1])
(a[i]!=b[j])
这里当a[i]和b[j]相同时,g[i-1][j],g[i-1][j-1],g[i][j-1]这三个的最长公共子序列不会重复,因为这里的g[i-1][j-1]实际上还要在末尾添加上a[i](或b[j]),因此这些lcs全都是以a[i],b[j]结尾的,而g[i-1][j]不包含以a[i]结尾的lcs,g[i][j-1]不包含以b[j]结尾的lcs,因此这三类lcs不会重复,可以直接相加。
当a[i]与b[j]不同时,最后当f[i][j]==f[i-1][j-1]时要减去g[i-1][j-1]就是因为这时g[i-1][j-1]被分别包含在g[i-1][j]和g[i][j-1]中,算了两次,要把重复的减掉。
于是就可以愉快地AC这道题了。
还有,一定要用滚动数组,不然爆!空!间!
丑代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod=;
int f[][],g[][];
char a[],b[];
int main()
{
int i,j,n,m;
scanf("%s%s",a,b);
n=strlen(a)-; m=strlen(b)-;
for(i=;i<=m;i++)g[][i]=; g[][]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
if(a[i-]==b[j-]){
f[i&][j]=f[i&^][j-]+;
g[i&][j]=(g[i&^][j-]+(f[i&^][j]==f[i&][j])*g[i&^][j]+(f[i&][j-]==f[i&][j])*g[i&][j-])%mod;
}
else{
if(f[i&^][j]>f[i&][j-])f[i&][j]=f[i&^][j];else f[i&][j]=f[i&][j-];
g[i&][j]=((f[i&^][j]==f[i&][j])*g[i&^][j]+(f[i&][j-]==f[i&][j])*g[i&][j-]-(f[i&][j]==f[i&^][j-])*g[i&^][j-]+mod)%mod;
}
printf("%d\n%d",f[n&][m],g[n&][m]);
}
【bzoj2423】最长公共子序列[HAOI2010](dp)的更多相关文章
- bzoj 2423: [HAOI2010]最长公共子序列【dp+计数】
设f[i][j]为a序列前i个字符和b序列前j个字符的最长公共子序列,转移很好说就是f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+(a[i]==b[j])) ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- P1439 【模板】最长公共子序列(DP)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- hdu 1159 Common Subsequence(最长公共子序列,DP)
题意: 两个字符串,判断最长公共子序列的长度. 思路: 直接看代码,,注意边界处理 代码: char s1[505], s2[505]; int dp[505][505]; int main(){ w ...
- 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- 最长公共子序列(DP)
Description 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列 X = { x1,x2,…,xm },则另一序列Z ={ z1,z2,…,zk },X 的子序列 ...
- NYOJ 36 最长公共子序列 (还是dp)
这个好多算法书上都有,不仅限于<算法导论> 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 咱们就不拐弯抹角了,如题.须要你做的就是写一个程序,得出最长公 ...
- PKU 1458 Common Subsequence(最长公共子序列,dp,简单)
题目 同:ZJU 1733,HDU 1159 #include <stdio.h> #include <string.h> #include <algorithm> ...
- 【noi 2.6_1808】最长公共子序列(DP)
题意:给2个字符串求其最大公共子序列的长度.解法:这个和一般的状态定义有点不一样,f[i][j]表示 str 前i位和 str2 前j的最大公共子序列的长度,而不是选 str 的第i位和 str2 的 ...
随机推荐
- Observable观察者模式的使用
今天我们公司封装的类中没有加上Observable观察者模式,但是很多地方需要用到Observable观察者模式 接下来就向大家介绍一下我的使用吧! 在介绍之前我们写了一个方法 public clas ...
- 关于java后台如何接收xml格式的数据
业务场景:用户发送下单请求,格式为xml格式,服务器接收数据完成下单,并返回结果给客户. 请求格式: <request> <head> <sign></sig ...
- java解析xml字符串为实体(dom4j解析)
package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...
- poj3481(splay tree 入门题)
平衡树都能做. // // main.cpp // splay // // Created by 陈加寿 on 16/3/25. // Copyright © 2016年 chenhuan001. A ...
- 巨蟒django之CRM3 添加和编辑客户&&公户和私户的展示和转换
昨日内容回顾: day66 1. 内容回顾 1. 数据的展示 数据通过ORM查询出来 对象列表 QuerySet 1. 普通的字段 对象.字段名 ——> 数据库中的值 2. choices (( ...
- 使用国内源(brew, pip, npm)
如果网络不行,安装依赖包的速度小于 100k/s 或者丢包严重导致安装很慢,我认为就应该使用国内源了.今天因为国内源的问题弄了很久,我觉得在国内服务器部署,全部应该从国内下载资源.分为两种情况, 存在 ...
- spring cloud 微服务应用间通讯
SpringCloud 应用间通信基于HTTP的Restful调用方式有两种,RestTemplate与Feign. 1.RestTemplate应用间通讯 通过 @LoadBalanced,可在re ...
- fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
stdint.h是c99标准的头文件,vc不支持,所以肯定会提示“No such file or directory”的. stdint.h是C99的标准,主要用于统一跨平台数据定义. MSVC中不带 ...
- 将电脑中编写的app网页放到手机上访问
http://jingyan.baidu.com/article/3065b3b6e5becdbecff8a4d5.html 1.在控制面板-管理工具找不到IIS,则先在程序-打开或关闭window功 ...
- 通过天天模拟器加burpsuite抓取手机app流量
通过天天模拟器,代理抓取安卓app数据包.也可以抓取https. 1.下载天天模拟器,官方下载即可,下载安装. 2.启动天天模拟器,设置代理,点击上方wlan设置图标,打开wlan设置,如下: 3.鼠 ...