BZOJ 2423 (求LCS的长度和种类数)
Description
Input
Output
Sample Input
BACBBD.
Sample Output
7
g[i][j]如何转移呢?考虑这是从那一步推过来的,
比如当 f[i][j]=f[i−1][j],就可以认为从f[i-1][j]转移过来,
那么g[i][j]=g[i-1][j];
那么有如下关系式:
当f[i][j]=f[i−1][j],g[i][j]+=g[i−1][j]
当f[i][j]=f[i][j−1],g[i][j]+=g[i][j−1]
当a[i]=b[j]且f[i][j]=f[i−1][j−1]+1,g[i][j]+=g[i−1][j−1],看起来好像没啥问题,but...样例都没法过,Orz
其实是忽略了一种情况(本质上是对这个状态转移不是特别清晰),
当a[i]≠b[j],并且f[i][j]=f[i−1][j−1]f[i][j]=f[i−1][j−1],(就是a,b的最后一位均没有匹配,会导致上面的2个if条件都会满足,
g[i][j]同时累计上g[i-1][j]和g[i][j-1]时,明显有重复的情况 。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int mod=;
const int maxn=;
char a[maxn], b[maxn];
int f[][maxn],g[][maxn]; int main()
{
//freopen("in.txt", "r", stdin); scanf("%s",a+);scanf("%s",b+);
int n=strlen(a+)-, m=strlen(b+)-; g[][]=;
for(int j=;j<=m;j++)
g[][j]=; for(int i=;i<=n;i++)
{
int now=i&,pre=now^;
for(int j=; j<=m; j++)
{
f[now][j]=max(f[pre][j], f[now][j-]);
if(a[i]==b[j])
{
f[now][j]=max(f[now][j],f[pre][j-]+);
if(f[now][j]==f[pre][j-]+)
g[now][j]=g[pre][j-];
}
else
{
g[now][j]=;
if(f[now][j]==f[pre][j-])
g[now][j]-=g[pre][j-];
}
if(f[now][j]==f[pre][j])
g[now][j]=(g[now][j]+g[pre][j])%mod; if(f[now][j]==f[now][j-])
g[now][j]=(g[now][j]+g[now][j-])%mod;
}
}
printf("%d\n%d",f[n&][m],g[n&][m]);
return ;
}
BZOJ 2423 (求LCS的长度和种类数)的更多相关文章
- 【转】最长公共子序列(LCS),求LCS长度和打印输出LCS
求LCS的长度,Java版本: public static int LCS(int[]a,int[] b) { int [][]c=new int[a.length+1][b.length+1]; f ...
- 字符串暴力枚举子序列求LCS
题意: 求n个串里的LCS,长度相同时按照字典序排序 solution: 断环为链,二进制枚举子序列,压入vector,按照字典序排序 把出现次数为n的,压入第二个vector 输出最长的第二个vec ...
- UVA 10635 Prince and Princess—— 求LCS(最长公共子序列)转换成 求LIS(最长递增子序列)
题目大意:有n*n个方格,王子有一条走法,依次经过m个格子,公主有一种走法,依次经过n个格子(不会重复走),问他们删去一些步数后,重叠步数的最大值. 显然是一个LCS,我一看到就高高兴兴的打了个板子上 ...
- poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 14653 Accepted: 6965 Descripti ...
- 【c语言】实现一个函数,求字符串的长度,不同意创建第三方变量
// 实现一个函数,求字符串的长度.不同意创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(ch ...
- char a[] = "ab\0123\098"; 求a的长度
原因: \0表示后面的字符是八进制(\ddd); 8进制=10进制( 10是'\n' 的ASCII码): 当\0后面有数字,且数字范围在0~7之间时,为8进制转义.如'\012': 当\0后面没有 ...
- C语言中求字符串的长度
在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示 ...
- 谈谈"求线段交点"的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- c# 用户输入一个字符串,求字符串的长度
C# 用户输入一个字符串,求字符串的长度使用字符串的length: class Program { static void Main(string[] args) { Console.WriteLi ...
随机推荐
- sql 2005性能调优
转自:http://www.cnblogs.com/MR_ke/archive/2010/08/25/1807856.html SQL Server在运行一段时间,随着数据的积累,SQL运行效率会逐步 ...
- python 中的__new__与__init__
在Python中的class中有两个方法__new__与__init__,有什么区别呢? class TestCls(): """docstring for TestCl ...
- cpu概念
cpu的主频=外频x倍频 cpu的主频不能完全决定cpu的性能,只是cpu性能的一个参数 cpu的外频是cpu的基准频率,它决定着整个主板的运行速度,超频超的是cpu的外频 IPC:cpu每一个时钟周 ...
- python连接mysql-PyMySql模块
安装 pip3 install pymysql 使用 输出mysql版本 import pymysql # 打开数据库连接 db = pymysql.connect("localhost&q ...
- js根据年月得到当前这个月总共有多少天
let curmonth; var curDay=this.getday(this.year,this.month); if(this.month >=10) { var curDate = t ...
- spring 事务注解
在spring中使用事务需要遵守一些规范和了解一些坑点,别想当然.列举一下一些注意点. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义 ...
- [js]面向对象2
delete删除属性 删除对象的属性 删除未用var定义的变量. delete返回布尔 删除不存在的属性,返回true 无法删除原形中的属性 如 delete obj.toString() resu= ...
- SpringBoot内置Tomcat缓存文件目录被意外删除导致异常
在项目中,一般会将文件临时保存到缓存目录 当时使用 File.createTempFile("tmp", ext, (File) request.getServletContext ...
- Ch02 控制结构和函数 - 练习
1. 一个数字如果为正数,则它的signum为1:如果是负数,则signum为-1:如果是0,则signum为0.编写一个函数来计算这个值. scala> def signum(x:Int):I ...
- require 和 import 区别
我很懵逼啊 都是在引用模块,那到底用哪个? 参考:https://www.cnblogs.com/hwldyz/p/9145959.html 看来会明白一点的 首先这两个都是为了JS模块化编程使用. ...