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的更多相关文章

  1. HDU 1503 Advanced Fruits(LCS+记录路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给出两个串,现在要确定一个尽量短的串,使得该串的子串包含了题目所给的两个串. 思路: 这道题目就是 ...

  2. LCS记录路径

    还想用hash记录……果然是天真.lcs转移比较简单,每次增加1.每次找是当前-1的就行了. #include <algorithm> #include <iostream> ...

  3. HDU1503(LCS,记录路径)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. LCS,LIS,LCIS

    网站:CSUST 8月3日(LCS,LIS,LCIS) LCS:      以下讲解来自:http://blog.csdn.net/yysdsyl/article/details/4226630 [问 ...

  5. LCS/LIS/LCIS 模板总结

    /************************* LCS/LIS/LCIs模板总结: *************************/ /*************************** ...

  6. 题解报告:hdu 1160 FatMouse's Speed(LIS+记录路径)

    Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...

  7. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  8. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  9. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  10. POJ 3436:ACM Computer Factory(最大流记录路径)

    http://poj.org/problem?id=3436 题意:题意很难懂.给出P N.接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2* ...

随机推荐

  1. 如何使用WordPress搭建网站

    1.空间的申请 阿里用户可以申请[阿里共享虚拟主机普惠版6元/年],虽然配置和空间不高,但也可以做个小站点的.当不满足当前配置的时候,随时可以进行升级,所以拿来练手还是比较合适的.   2.WordP ...

  2. CSS三角形/气泡的实现原理及应用

    记得第一次面试,面试官问如何用css实现一个不规则三角形?好叭 ·-·,触及到知识盲区了,手动叹气(╥﹏╥),好在别的回答的还好,没挂

  3. Taro 和 uni-app选型对比

    一.Taro和uni-app的介绍 1.taro的介绍 taro是多端统一开发框架,支持用 React 的开发方式编写一次代码,生成能运行在微信/百度/支付宝/字节跳动小程序.H5.React Nat ...

  4. Mysql性能优化:如何给字符串加索引?

    导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...

  5. Python第七章-面向对象

    面向对象编程基础 一.面向对象概念 1.1 什么是面向过程 ​ 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ​ 生活中的的例子举例. 1.2 ...

  6. ios 13 陀螺仪DeviceOrientationEvent需要申请用户权限

    有些代码跑着跑着就报错了,有些陀螺仪用着用着就不能用了. 目前时间是2020.4.4,发现  ios 13系统调用陀螺仪 需要申请用户权限(这应该是个趋势,后面安卓应该陆续跟进).具体实现来看下: 1 ...

  7. iOS OCR

    身份证识别,又称 OCR 技术.OCR 技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算 ...

  8. Dubbo与Spring Cloud的比较

    区别: ----- 来源(背景): Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点. Spring Cloud,从命名我们就可以知道,它是Spring Source ...

  9. MATLAB—地图

    一.画亚洲地图 1.worldmap() (1) clear all worldmap('World') clear all worldmap('World')%世界地图 load coast %载入 ...

  10. 多源第k短路 (ford + 重新定义编号) / 出发点、终点确定的第k短路 (Spfa+ 启发搜索)

    第k短路 Description 一天,HighLights实在是闲的不行,他选取了n个地点,n各地点之间共有m条路径,他想找到这m条路径组成的第k短路,你能帮助他嘛? Input 第一行三个正整数, ...