BZOJ2423 [HAOI2010]最长公共子序列
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
题目链接:BZOJ2423
正解:DP
解题报告:
考虑用f[i][j]表示第一个字符序列的前i位与第二个字符序列的前j位的最长公共子序列长度,那么转移的就直接根据这一位是否对应相等转即可:
f[i][j]=f[i-1][j-1]+1(a[i]=b[j]);f[i][j]=max(f[i][j-1],f[i-1][j])(a[i]!=b[j])。
第二问有一点麻烦…
要讨论一下每个取值在哪取到,不能算重了…
考虑一下f[i][j]和之前的哪些相同,yy一下就可以咯。
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
using namespace std;
typedef long long LL;
typedef long double LB;
typedef complex<double> C;
const double pi = acos(-1);
const int MAXN = 5011;
const int mod = 100000000;
char ch[MAXN],s[MAXN];
int n,m,f[2][MAXN],g[2][MAXN];inline int getint(){int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
}inline void work(){scanf("%s",ch+1); scanf("%s",s+1);n=strlen(ch+1); m=strlen(s+1); n--; m--;for(int i=0;i<=m;i++) g[0][i]=1;//边界!int tag=0; g[1][0]=1;for(int i=1;i<=n;i++) {tag^=1; //memset(f[tag],0,sizeof(f[tag]));//memset(g[tag],0,sizeof(g[tag]));for(int j=1;j<=m;j++) {if(ch[i]==s[j]) {f[tag][j]=f[tag^1][j-1]+1;g[tag][j]=g[tag^1][j-1];g[tag][j]+=(f[tag][j]==f[tag^1][j])*g[tag^1][j];g[tag][j]+=(f[tag][j]==f[tag][j-1])*g[tag][j-1];}else {f[tag][j]=max(f[tag][j-1],f[tag^1][j]);g[tag][j]=(f[tag][j]==f[tag^1][j])*g[tag^1][j];g[tag][j]+=(f[tag][j]==f[tag][j-1])*g[tag][j-1];g[tag][j]-=(f[tag][j]==f[tag^1][j-1])*g[tag^1][j-1];}g[tag][j]%=mod;}}printf("%d\n",f[tag][m]);g[tag][m]+=mod; g[tag][m]%=mod;printf("%d",g[tag][m]);
}int main()
{work();return 0;
}
转载于:https://www.cnblogs.com/ljh2000-jump/p/6506745.html
BZOJ2423 [HAOI2010]最长公共子序列相关推荐
- bzoj2423[HAOI2010]最长公共子序列
bzoj2423[HAOI2010]最长公共子序列 题意: 求两个字符串的最长公共子序列长度和个数.字符串长度均≤5000. 题解: dp,设f[i][j]表示x串i位到末位,y串j位到末位的最长长度 ...
- [DP] bzoj2423: [HAOI2010]最长公共子序列
bzoj2423: [HAOI2010]最长公共子序列:https://www.lydsy.com/JudgeOnline/problem.php?id=2423 DP 神啊(DP都是神奇的东西) 第 ...
- LGOJ P2516 BZOJ2423 [HAOI2010]最长公共子序列 解题报告
文章目录 题目链接 解题思路 对于第一问,这是LCS问题的经典模型 对于第二问,同样用DP来做 详细代码 题目链接 LGOJ BZOJ 解题思路 对于第一问,这是LCS问题的经典模型 我们设f[i][ ...
- BZOJ2423/HAOI2010 最长公共子序列
思路: 非常经典的问题就不讲了.后面求方案的时候注意不要忘记讨论情况. 还有要滚动一维. #include<iostream> #include<cstdio> #includ ...
- BZOJ 2423: [HAOI2010]最长公共子序列
2423: [HAOI2010]最长公共子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1696 Solved: 674 [Submit][ ...
- 【BZOJ2423】最长公共子序列(动态规划)
[BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...
- 【bzoj2423】最长公共子序列[HAOI2010](dp)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2423 题目大意:求两个字符串的最长公共子序列长度和最长公共子序列个数. 这道题的话,对于 ...
- 10.31T4 HAOI2010最长公共子序列 计数+容斥原理
2775 -- [HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序 ...
- bzoj 2423 [HAOI2010]最长公共子序列 动态规划
Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1" ...
最新文章
- Java XML解析工具 dom4j介绍及使用实例
- 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
- vue中textarea标签自适应高度
- 高并发编程-线程通信_使用wait和notify进行线程间的通信
- iOS游戏开发教程资源
- 读”SQL Injection Pocket Reference”之摘录
- 2020蓝桥杯省赛---java---B---7(单词分析)
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
- rabbitmq技术的一些感悟(二)
- 为SQL缓存通知启用数据库
- js去掉所有html标记
- u盘安装linux系统有什么弊端,使用U盘安装Linux系统的经验总结
- Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法
- 游戏官网的HTML布局,游戏网站页面布局关键
- 音频剪切matlab,科学网—matlab的音频处理:读取,裁剪,输出和命名 - 张智昊的博文...
- 理解偏导数、梯度、方向导数
- 金蝶云苍穹轻量级开发人员申请试用
- vue学习笔记 DAY1 P1~P6
- Vue响应式实现原理
- 计算机基础知识截屏,电脑截屏技巧 截图快捷键是什么
热门文章
- 微信小程序真机调试和开发工具调试问题解决
- 中小学计算机课标,中小学信息技术课程标准(新课标)
- 小写转大写,大写转小写,数字不显示
- (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
- ES(ElasticSearch)自定义分词字典
- MATLAB怎么样绘制扭转减震器,基于MATLAB的汽车减震系统仿真建模
- 苏州新导养老院看护系统,实现一对一智能看护,智能化养老院逐渐兴起
- Unity3D开发之控制摄像机移动
- 试着使用SDL2复刻曹操传(二)
- 魔兽怀旧服wowlua api获取人物坐标信息