permu

  [Description]

    给定两个1~N的全排列A,B。有两个指针q和p,一开始q、p都为0,可执行以下三种操作:
    1.q+1;2.p+1;3.q+1且p+1(Aq+1≠Bp+1时才可以这么做)。

  [Hint]

    <=1000000


  f[i][j]代表p指i,q指j的时候还需要多少步才能到终点

  30分转移:f[i][j]=f[i+1][j+1]+1(a[i+1]!=a[j+1]) f[i][j]=min(f[i+1][j],f[i][j+1])+1.

  题目中有一个性质。。然而之前并没看到。。A和B数组是1-n的全排列

  然后意思就是 f[i][j]=min(f[i+1][j],f[i][j+1])+1 这种转移最多n次

  第一种转移,我们可以简单地用队列处理:先将f[n][0~n]存在队列中,然后将f[n][0]出队,将f[n][1~n]++,变成f[n-1][0~n-1],再往队尾添加f[n-1][n],对f[i+1][0~n]转移到f[i][0~n]的情况亦然。

  但这只是能解决第一种转移,第二种转移需要另作处理。对于f[i+1][0~n]到f[i][0~n]的转移,如果a[i+1]==b[j+1],f[i+1][j+1]就无法通过第一种转移转移到f[i][j]。对每个i,也存在且仅存在一个j,使得f[i][j]无法进行第一种转移。
  对于第二种转移我们可以这样简化:
  因为a[i+1]==b[j+1],所以a[i+1]!=b[j],所以f[i][j-1]==f[i+1][j]+1。
  所以f[i][j]=min{f[i][j-1],f[i][j+1]+1} (a[i+1]==b[j+1])
  有了这个方程,就可以在第一种转移完成后,找到使得a[i+1]==b[j+1]的j,取f[i][j]为队列中其前驱元素的值与其后继元素的值加1的较小值为f[i][j]的值。

  

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> #define maxn 1000001 using namespace std; inline int in()
{
int x=,f=;char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')ch=getchar(),f=-;
while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
return f*x;
} int q[maxn*],fpos[maxn],a[maxn]; int main()
{
freopen("permu.in","r",stdin);
freopen("permu.out","w",stdout);
int n,u,head=,tail;
n=in();
tail=n;
for(int i=;i<=n;i++)a[i]=in();
for(int i=;i<=n;i++)u=in(),fpos[u]=i;
for(int i=;i<=n;i++)q[i]=n-i;
for(int i=n;i;i--){
int t=fpos[a[i]];head++;
q[head+t-]=min(q[head+t-],q[head+t]+);
q[++tail]=;
}
printf("%d",q[head]+n);
return ;
}

【DP】permu的更多相关文章

  1. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  2. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  3. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  4. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  5. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  6. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  7. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  8. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

  9. 【BZOJ4358】permu kd-tree

    [BZOJ4358]permu Description 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域连续段长度. Input 第一行两个整 ...

随机推荐

  1. Silverlight中动画的性能浅析

    Silverlight中提供了StoryBoard实现动画,可是StoryBoard的性能实在不敢恭维,特别是动画很大的时候,计算机的CPU和内存的狂增,如此一来性能实在太差,在默认的动画效果中动画实 ...

  2. MongoDB 删除数据库

    MongoDB 删除数据库 语法 MongoDB 删除数据库的语法格式如下: db.dropDatabase() 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名. 实例 以下 ...

  3. 高可用工具keepalived学习笔记

    keepalived完全遵守VRRP协议包括竞选机制,至于VRRP是什么这里不说了参考http://wenku.baidu.com/link? url=1UbkmHuQlGECgC90P7zF6u2x ...

  4. 模拟新浪微博textarea,刷新页面输入信息保留

    今天我们的产品经理提出一个新需求,模拟新浪微博textarea框,输入内容刷新页面保留信息. 我是用的方法是Html5 LocalStorage存储的,开始计划用cookie.或mysql存储,尝试了 ...

  5. CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。

    firewall:systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsyst ...

  6. ASP.NET MVC5学习笔记之Action参数模型绑定基本过程

    当我们在Controller中定义一个Action,通常会定义一个或多个参数,每个参数称为一个模型,ASP.NET MVC框架提供了一种机制称为模型绑定,会尝试自动从请求的信息中实例化每一个模型并赋值 ...

  7. Delphi CxGrid 汇总(4)

    1.     CxGrid汇总功能 ① OptionsView-Footer设置为True,显示页脚   ② CxGrid的Summary选项卡定义要汇总的列和字段名及汇总方式,Footer选项卡定义 ...

  8. Tostring记录,方便自己查看

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  9. C# WPF使用ZXing生成二维码ImageSource

    介绍: 如果需要实在WPF窗体程序中现类似如下的二维码图片生成功能,可以通过本文的方法实现 添加步骤: 1.在http://zxingnet.codeplex.com/站点上下载ZXing .Net的 ...

  10. C 函数可变参数

    C 函数可变参数 C 语言中用 ... 表示可变参数,例如: void fun(int x ...) 头文件 cstdarg.h 中包含可变参数类型va_list和处理可变参数的三个宏: va_lis ...