拖了好久的LCIS

f[i][j]表示a串前i个,b串以b[j]结尾的LCIS长度。

转移时考虑a[i]和b[j]是否相等,如果不等:

那么既然是以j结尾,说明a串前i-1位有一个字符和b匹配了,所以由f[i-1][j]转移来(i-1涵盖所有方案)

如果相等,那么考虑由什么转移来

f[i-1][k]是一个前驱状态,既然a[i]匹配了,就只能考虑前i-1位了,由于定义如此,所以可以“笼统地”从f[i-1][]转移来,第二维就得枚举j前面的k,且b[k]<b[j],满足递增性质

这样做是O(n^3)的复杂度,考虑优化一下。

对于一个相等的状态,这里O(n)的转移就是优化的瓶颈了,看看怎么做。

f[i][j]只能从f[i-1][k]转移来,k还得小于j,所以可以一边循环j一边用mx记录f[i][1~j-1]的最大值,前提是b[j]>a[i]。

这样转移就可以写成f[i][j]=mx+1了,O(n^2)的复杂度。

第一维可以像01背包一样压下来,空间O(n)

#include<iostream>
#include<cstdio> using namespace std; const int MAXN=; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} int n;
int a[MAXN],b[MAXN]; int f[MAXN][MAXN]; int main(){
n=rd();
for(int i=;i<=n;i++) a[i]=rd();
for(int i=;i<=n;i++) b[i]=rd();
for(int i=;i<=n;i++){
int mx=;
for(int j=;j<=n;j++){
if(a[i]>b[j]) mx=max(mx,f[i-][j]);
if(a[i]!=b[j]){
f[i][j]=f[i-][j];
continue;
}
if(a[i]==b[j]) f[i][j]=mx+;
}
}
int ans=;
for(int i=;i<=n;i++) ans=max(ans,f[n][i]);
cout<<ans; return ;
}

最新文章

  1. #9.5课堂JS总结#循环语句、函数
  2. Nodejs 之Ajax的一个实例(sql单条件查询&amp;并显示在Browser端界面上)
  3. 修改tomcat的端口
  4. lbs(查看附近的人),看看社交软件如何实现查看附近的人
  5. 实验箱FPGA部分测试报告及A8与FPGA链接测试报告
  6. a++累加
  7. 如何用chrome修改js代码,跳过网站等待时间
  8. golang 轮训加密算法
  9. 计蒜客NOIP模拟赛4 D1T1 小X的质数
  10. 20190328-CSS样式一:字体样式font-、文本样式text-、背景图样式background-
  11. Android系统修改之Notification布局修改(一)
  12. istio路由配置
  13. 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
  14. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)
  15. 使用phpStudy运行伊人集项目
  16. “数学口袋精灵”第二个Sprint计划(第三天)
  17. Google File System 学习
  18. springmvc基础流程
  19. hibernate的异常 Session was already closed
  20. AndroidStudio下使用 RecyclerView xml文件不显示预览条目并报错类似:NoClassDefFoundError 问题解决

热门文章

  1. 模板 - 动态规划 - 概率期望dp
  2. (一)搭建自己的SpringBoot后台框架整合MyBatis
  3. Ubuntu 18.04 LTS 安装过程
  4. docker系列(一):docker基础与安装笔记
  5. Salazar Slytherin&#39;s Locket CodeForces - 855E
  6. 前端之HTML语法及常用标签
  7. AJPFX总结面向对象(this和super的区别和应用)
  8. angular(一)路由的配置(1)
  9. XDroidMvp 轻量级的Android MVP快速开发框架
  10. 一份最贴近真实面试的Java基础面试题