6820 [PA2012]Two Cakes
曹队是我们的红太阳!我们要矢志不渝跟着曹队走!!!
然后你可以发现
那
如果
那么就是
然后开始神乎其技地优化状态了:
由于是个排列,所以
而
所以我们只需要算那“n个状态的答案”即可,需要哪个dp值直接算。
如何迅速找?开个g数组维护一下即可。
//抄代码带师
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using std::max;
using std::min;
const int MAXN=1001000;
int n;
int a[MAXN],b[MAXN];
int pos[MAXN];
int F[MAXN];//F[i]表示,找和i颜色一样的j,即f[i][j]
int G[MAXN<<1];//最靠后的<i,j>
int get_f(int i,int j){
if(!G[j-i+1+n])return max(i,j);
return F[G[j-i+1+n]]+i-G[j-i+1+n];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++)pos[b[i]]=i;
for(int i=1;i<=n;i++){
int j=pos[a[i]];
F[i]=min(get_f(i,j-1)+1,get_f(i-1,j)+1);
G[j-i+1+n]=i;
}
printf("%d\n",get_f(n,n));
return 0;
}