LCS(记录路径)+LIS+LCIS
https://blog.csdn.net/someone_and_anyone/article/details/81044153
当串1 和 串2 的位置i和位置j匹配成功时,
dp[i][j]=dp[i-1][j-1]+1,也就是说此状态由状态dp[i-1][j-1]转移而来,用数组记录为1,
当匹配不成功时,dp[i-1][j]和dp[i][j-1]去一个最大的,用数组分别记为2和3.
根据记录数组寻找路径:
当记录数组为1时,说明次时的i和j想等,并且此状态由i-1和j-1转移而来,所以i=i-1,j=j-1
当记录数组为2时,说明此时i和j对应的数符不等,并且此状态由j-1转移而来,所以直接j--;
当记录数组为2时,说明此时i和j对应的数符不等,并且此状态由i-1转移而来,所以直接i--;
- #include<bits/stdc++.h>
- using namespace std;
- const int N=+;
- int dp[N][N];
- int mark[N][N];
- char s1[N],s2[N];
- int main()
- {
- cin>>s1+>>s2+;
- int n=strlen(s1+);
- int m=strlen(s2+);
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++){
- if(s1[i]==s2[j]){
- dp[i][j]=dp[i-][j-]+;
- mark[i][j]=;
- }
- else if(dp[i][j-]>dp[i-][j]){
- dp[i][j]=dp[i][j-];
- mark[i][j]=;
- }
- else {
- dp[i][j]=dp[i-][j];
- mark[i][j]=;
- }
- }
- string ans="";
- int i=m,j=n;
- while(i>&&j>){
- if(mark[i][j]==) {
- ans+=s1[i];
- i--;j--;
- }
- else if(mark[i][j]==) {
- j--;
- }
- else i--;
- }
- reverse(ans.begin(),ans.end());
- cout<<ans<<endl;
- return ;
- }
LIS:最长上升子序列。
O(n^2):
定义dp[i]表示考虑到第i个元素,他可以拼接到从1~i-1中比它小的元素上去。
dp[i]=max(dp[k])+1,代码比较简单,在此省略。
O(nlogn):
定义dp[len]表示当长度为len时的最小元素。
code:
- dp[]=a[];
- int len=;
- for(int i=;i<=n;i++){
- if(a[i]>dp[len]) dp[++len]=a[i];
- else *lower_bound(dp+,dp++len,a[i])=a[i];
- }
LCIS:最长公共上升子序列
定义状态dp[i][j]表示考虑前i个字符时,当选中第j个字符时的状态。
在这里第j个字符已经选了,所以前i个字符一定有和它匹配的,当第j个字符和第i个字符不匹配成功时,那第j个字符一定和
前i-1中的一个字符匹配喽,所以转移方程为dp[i][j]=dp[i-1][j],还是以j结尾。
当第j个字符和第i个字符匹配成功时,dp[i][j]=max(dp[i-1][k])+1,要在和前i-1个匹配的字符中选出状态最好的。
所以状态转移方程为:
dp[i][j]=dp[i-1][j],匹配成功。
dp[i][j]=max(dp[i-1][k])(k<=j)匹配不成功。
code:
- void solve(int t){
- ll n,m;
- cin >> n;
- for (ll i = ; i <= n; i++) cin >> arr[i];;
- cin >> m;
- for (ll i = ; i <= m; i++) cin >> brr[i];
- ll mx = ;
- for (ll i = ; i <= n; i++) {
- mx = ;
- for (ll j = ; j <= m; j++) {
- dp[i][j] = dp[i - ][j];
- if (brr[j] < arr[i]) mx = max(mx, dp[i-][j]);
- else if (arr[i] == brr[j]) dp[i][j] = mx + ;
- }
- }
- ll ans = ;
- for (ll i = ; i <= m; i++) ans = max(ans, dp[n][i]);
- cout << ans<<"\n"<<"\n";
- }
一个例题:
HDU1423:Greatest Common Increasing Subsequence
code:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- const ll N = 1E3 + ;
- ll arr[N];
- ll brr[N];
- ll dp[N][N];
- void solve(int t){
- ll n,m;
- cin >> n;
- for (ll i = ; i <= n; i++) cin >> arr[i];;
- cin >> m;
- for (ll i = ; i <= m; i++) cin >> brr[i];
- ll mx = ;
- for (ll i = ; i <= n; i++) {
- mx = ;
- for (ll j = ; j <= m; j++) {
- dp[i][j] = dp[i - ][j];
- if (brr[j] < arr[i]) mx = max(mx, dp[i-][j]);
- else if (arr[i] == brr[j]) dp[i][j] = mx + ;
- }
- }
- ll ans = ;
- for (ll i = ; i <= m; i++) ans = max(ans, dp[n][i]);
- cout << ans<<"\n";
- if(t) cout<<"\n";
- }
- int main(){
- ll t;
- cin >> t;
- while (t--) solve(t);
- return ;
- }
LCS(记录路径)+LIS+LCIS的更多相关文章
- HDU 1503 Advanced Fruits(LCS+记录路径)
http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给出两个串,现在要确定一个尽量短的串,使得该串的子串包含了题目所给的两个串. 思路: 这道题目就是 ...
- LCS记录路径
还想用hash记录……果然是天真.lcs转移比较简单,每次增加1.每次找是当前-1的就行了. #include <algorithm> #include <iostream> ...
- HDU1503(LCS,记录路径)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- LCS,LIS,LCIS
网站:CSUST 8月3日(LCS,LIS,LCIS) LCS: 以下讲解来自:http://blog.csdn.net/yysdsyl/article/details/4226630 [问 ...
- LCS/LIS/LCIS 模板总结
/************************* LCS/LIS/LCIs模板总结: *************************/ /*************************** ...
- 题解报告:hdu 1160 FatMouse's Speed(LIS+记录路径)
Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...
- F - LCS 题解(最长公共子序列记录路径)
题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...
- Educational DP Contest F - LCS (LCS输出路径)
题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- POJ 3436:ACM Computer Factory(最大流记录路径)
http://poj.org/problem?id=3436 题意:题意很难懂.给出P N.接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2* ...
随机推荐
- 洛谷1063 +区间dp(经典问题)
题目网址:https://www.luogu.com.cn/problem/P1063 题意大致是:给定一个序列An,第i个元组表示为(Ai,Ai+1),序列位置不变,当合并一个区间[l,l+1]时开 ...
- eNSP之VLAN设计实验
0.实验目的 1.掌握基于IP地址的VLAN划分: 2.掌握基于交换机端口VLAN划分: 3.通过网关实现不同VLAN间的通讯; 1.实验环境 环境:eNSP模拟器 版本信息:1.3.00.100 V ...
- 热点 | 四月最佳Github项目库与最有趣Reddit热点讨论
来源:Analytics Vidhya 编译:磐石 [磐创AI导读]:Github是全球最大的开源代码社区,Reddit是最受大家欢迎的热点讨论交流平台.接下来磐创AI将为大家带来四月份Github最 ...
- coding++ :MySQL 使用 SQL 语句查询数据库所有表注释已经表字段注释
1.要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 ‘mammothcode’ 所有表注释 */ SELECT TABLE_NAME,TABLE_ ...
- nodejs使用express中静态资源托管(express.static())时遇到的bug
如下:将test.html的页面挂载在服务器上, const express= require('express') const fs= require('fs') let app = express ...
- 非常诡异的IIS下由配置文件加上svg的mime头导致整个网站的静态文件访问报错误
调试了两天遇到一个非常诡异的问题 一个系统稳定运行了很多年,是用mvc5+WIN2008R2 + .NET 4.5 +IIS环境下运行,非常稳定,最近想迁移到一台新的服务器,为了少麻烦在阿里云上买了 ...
- Spring Boot 中自定义 SpringMVC 配置,到底继承谁哪一个类或则接口?
看了这篇文章,写的非常的言简意赅,特此记录下: 1.Spring Boot 1.x 中,自定义 SpringMVC 配置可以通过继承 WebMvcConfigurerAdapter 来实现. 2.Sp ...
- MQTT协议实现Android中的消息收发
前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),基于发布/订阅范式的消息协议,是一种极其简单和轻量级的消息协议,专为受限设备和低带宽.高延迟 ...
- 并查集 & 最小生成树详细讲解
并查集 & 最小生成树 并查集 Disjoint Sets 什么是并查集? 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将 ...
- php连接数据库,php连接mysql并查询的几种方式,PHP PDO连接以及预处理
PHP连接数据库 面向过程 $config = [ 'host'=>'127.0.0.1', //数据库地址 'name'=>'test', //库名 'user'=>'root', ...