题面

一道线性 DP 好题。

设 \(dp_{i,j}\) 表示在所有 \(a_{1\dots i}\),\(b_{1\dots j}\) 的子序列中,以 \(b_j\) 结尾的最长公共上升子序列的最大长度。

转移的时候考虑 \(2\) 种情况:

  • 若不选择 \(a_i\),则 \(dp_{i,j}=dp_{i-1,j}\);
  • 若选择 \(a_i\),则 \(dp_{i,j} = \max_{1\leq k \leq j,b_k < b_j}\{dp_{i-1,k}\}+1\)。又因为有 \(a_i=b_j\),所以 \(dp_{i,j} = \max_{1\leq k \leq j,b_k < a_i}\{dp_{i-1,k}\}+1\)。

转移的代码:

for (int i = 1; i <= n; i+=1)
for (int j = 1; j <= n; j+=1)
{
dp[i][j] = dp[i - 1][j];
if (a[i] == b[j])
{
int maxdp = 0;
for (int k = 1; k < j; k+=1)
if (b[k] < a[i])
maxdp = max(maxdp, dp[i - 1][k]);
dp[i][j] = max(dp[i][j], maxdp + 1);
}
}

这样转移的复杂度其实是 \(O(n^3)\) 的,明显会超时。

于是我们考虑优化,即对转移的代码进行等价变形。

我们发现,第三重循环能够转移的状态其实是所有 小于 \(j\) 的 \(k\),且 \(b_k < a_i\)。因为 \(a_i\) 的值是不变的,所以我们可以预处理出所有 \(dp_{i,k}(k<j)\) 的最大值,即 \(dp_{i,j}\) 的前缀最大值。

具体做法就是将变量 maxdp 移到第二层循环外,然后如果 \(b_j < a_i\) 就将 maxdp 与 \(dp_{i,j}\) 取 \(\max\)。

完整代码:

#include <bits/stdc++.h>

using namespace std;

const int N = 3003;

int n, m;
int a[N], b[N], dp[N][N]; int main()
{
cin >> n;
for (int i = 1; i <= n; i+=1)
cin >> a[i];
for (int i = 1; i <= n; i+=1)
cin >> b[i];
for (int i = 1; i <= n; i+=1)
{
int maxdp = 0;
for (int j = 1; j <= n; j+=1)
{
dp[i][j] = dp[i - 1][j];
if (a[i] == b[j]) dp[i][j] = max(dp[i][j], maxdp + 1); //转移
if (b[j] < a[i]) maxdp = max(maxdp, dp[i][j]); //前缀最大值
}
}
int ans = 1;
for (int i = 1; i <= n; i+=1) ans = max(ans, dp[n][i]);
cout << ans << endl;
return 0;
}

最新文章

  1. 我的MYSQL学习心得(五) 运算符
  2. Object-C中一些不同于C系列语言表现的特性
  3. 好文EF
  4. hdu 1281 棋盘游戏
  5. [转]C#中yield用法
  6. 漏网之鱼--HTML&amp;CSS
  7. 【DOORS】如何基于DOORS实施需求管理
  8. Java IO详解(六)------随机访问文件流
  9. react入门(一)
  10. C#设计模式(5)——建造者模式
  11. python中字符串前的r什么意思
  12. 执行webpack-dev-server时,提示端口被占用。
  13. 关于一个div上下左右居中的css方法
  14. .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法
  15. freemarker【FTL】常见语法大全
  16. 安全测试工具之Burpsuite
  17. angular controller 之间的通信方式
  18. python使用selenium、PhantomJS获得网站cookie信息#windows
  19. Jmeter----HTTP Request Defaults
  20. Java基础教程:IO流与文件基础

热门文章

  1. 【WPF学习】第四十六章 效果
  2. Vue实战之【企业开发常见问题】
  3. [CentOS7]安装ODBC Driver 17 for SQL Server
  4. HDU 2018 DP
  5. Cobalt Strike生成后门
  6. nodejs对字符串进行base64转换和解析
  7. Kubernetes 部署 Nebula 图数据库集群
  8. c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法
  9. Luarocks 安装艰难过程
  10. 防止或减少过拟合的方式(二)——Dropout