题面

https://www.lydsy.com/JudgeOnline/problem.php?id=4990

分析

首先可以看出一个简单的DP
dp[i][j]表示序列a前i个与序列b前j个连线数量
dp[i][j]=max(dp[i−1][j],dp[i][j−1],dp[i−1][j−1](∣a[i]−b[j]∣<=4))
这样DP的时间复杂度为O(n^2)
发现该方程除了转移的判断条件之外和LCS并无什么不同,因此可考虑LCS的优化方法

提示:阅读下面内容前,请先确保自己掌握一般情况下LCS转LIS的过程,以及LIS的O(nlog2n)O(nlog_2n)算法

考虑LCS转LIS,原本的方法是记录a[i]中每个值的位置pos,将b[i]转化为pos[b[i]]
既然∣a[i]−b[j]∣<=4都可杯看做“相等”
则我们对于每个b[i]±j (0<=j<=4),将pos[b[i]±j]加入数组c,求c的LIS即为答案
但注意到每个点只能连一条边,也就是对于每个b[i],9个b[i]±j中只能选一个加入LIS
所以将9个一组从大到小排序,再拼起来,这样每组数中至多有一个数被选进LIS,(若选两个,则c[i]>c[i+1],矛盾)
时间复杂度O(nlog_2n)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 100005
using namespace std;
int n;
int a[maxn],b[maxn];
int pos[maxn];
vector<int>tmp;
vector<int>c;
int s[maxn*9];
int m;
int cmp(int x,int y) {
return x>y;
}
int solve() {
for(int i=1;i<=n;i++){
tmp.clear();
for(int j=0;j<=4;j++){
if(b[i]+j<=n) tmp.push_back(pos[b[i]+j]);
if(b[i]-j>=1) tmp.push_back(pos[b[i]-j]);
}
sort(tmp.begin(),tmp.end(),cmp);
int t=tmp.size();
for(int j=0;j<t;j++){
c.push_back(tmp[j]);
}
}
int m=c.size();
// for(int i=0;i<m;i++) printf("%d ",c[i]);
// printf("\n");
int top=0;
for(int i=0; i<m; i++) {
if(c[i]>s[top]) {
s[++top]=c[i];
} else {
int tmp=lower_bound(s+1,s+1+top,c[i])-s;
s[tmp]=c[i];
}
}
return top;
} int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
pos[a[i]]=i;
}
for(int i=1; i<=n; i++) {
scanf("%d",&b[i]);
}
printf("%d\n",solve());
}

最新文章

  1. CRL快速开发框架系列教程五(使用缓存)
  2. c语言 sizeof理解
  3. Activity 横竖屏切换
  4. Python基础-day2
  5. history/location操作 /navigator 操作/ screen操作
  6. c#面向对象基础 静态成员、构造函数、命名空间与类库
  7. CSS:CSS定位和浮动
  8. Android 主页面顶部栏的通知Notification ,可以自定义通知消息栏的风格,并且点击通知栏进人本程序。
  9. java中Pattern.compile函数的相关解释
  10. POJ 2151 Check the difficulty of problems (动态规划-可能DP)
  11. bzoj3551
  12. Linux 小记 — 网络管理
  13. python基础—装饰器
  14. Scala字节数组转换为数字
  15. 2018-软工机试-C-和你在一起
  16. BZOJ4128Matrix——hash+矩阵乘法+BSGS
  17. python购物车作业
  18. adb环境变量配置
  19. idea git 使用
  20. Radio中REG

热门文章

  1. RPC协议解析
  2. Kafka---系统学习
  3. python-登录保持
  4. OC项目调用C++
  5. 2,Executor线程池
  6. PHP培训教程 PHP里10个鲜为人知但却非常有用的函数
  7. CSS中的自适应单位vw、vh、vmin、vmax
  8. JSP上传一个文件夹
  9. 通过运行窗口输入命令方式,打开Internet窗口
  10. [洛谷P5106]dkw的lcm:欧拉函数+容斥原理+扩展欧拉定理