前情概要:很重要!!
大家好,在看此博客之前,大家可以先看我dp动态规划合集里面的首篇内容《数字三角形》
配合食用更佳!
链接:
概述:LCS:
LCS: 最长公共子序列 ;
本讲讲述:LCS+LIS的问题:最长公共上升子序列
《最长公共上升子序列》
按照我们上几讲的集合dp分析法:
开始分析:
写代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 3e3+9;
int a[N];
int b[N];
int f[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=n;++i)
{
cin>>b[i];
}
for(int i=1;i<=n;++i)
for(int j =1;j<=n;++j)
{
f[i][j] = f[i-1][j];//右集合
if(a[i]==b[j])
{
f[i][j] = max(f[i][j] , 1); //左集合(空)
for(int k=1;k<j;++k)
{
if(b[k] < b[j])//如果前面那项小于后面那项
f[i][j] = max(f[i][j] ,f[i][k] + 1);
//左集合(其他)
}
}
}
int res = 0;
for(int i= 1;i<=n;++i)
{
for(int j= 1;j<=n;++j)
{
res = max(res, f[i][j]);
}
}
cout << res<<'\n';
return 0;
}
这个是O(n^3)复杂度的解法!!!!
总结:
我们的方法只需按照集合分析的步骤走,就很快可以解出来!做上一个题目是对下一个题目有好处的!这就是今天 的dp——LCS和LIS结合问题,希望大家有所收获!!