【DP】permu
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的更多相关文章
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
- 【BZOJ4358】permu kd-tree
[BZOJ4358]permu Description 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域连续段长度. Input 第一行两个整 ...
随机推荐
- winfrom 导入Excel表到access数据库(来自小抽奖系统)
网上有很多这种方法,本人只是针对自己的系统来实现的 //导入excel表 private void ImportTSMenu_Click(object sender, EventArgs e) { O ...
- Html辅助方法(分页、下拉框)
引用命名空间: using System.Text; using System.Web.Mvc; Html分页方法 #region 分页Html辅助方法 /// <summary> /// ...
- 收缩SQL数据库日志
各位同学,相信大家在使用SQL数据库时,常常会遇到日志文件比数据库文件还在大的情况.以下有一简单的办法,可以快速的删除日志档.使用其大小变为540K. 供各位参考. DUMP TRANSACTION ...
- Silverlight RadGridView的HeaderCellStyle样式
效果图 <UserControl x:Class="SilverlightApplication7.MainPage" xmlns="http://schemas. ...
- WIN8 下 Hyper-V和Vmware Workstation
1 管理员身份运行命令提示符 cmd bcdedit /copy {current} /d “Windows Without Hyper-V 2 记下 { } 中的代码 bcdedit /set {X ...
- 添加Microsoft SQL JDBC driver 到 Maven
主要步骤如下: 1. 本地下载sqljdbc4.jar 2. 解压到本地文件夹中,并找到sqljdbc4.jar路径 3. 打开命令窗口,打开至工程目录,执行以下语句(前提:先配置好maven环境变量 ...
- javascript回车完美实现tab切换功能
javascript通过回车实现tab切换功能,最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel ...
- ArrayAdapter的简单使用
1.创建一个类继承ArrayAdapter private class MyAdapter extends ArrayAdapter { LayoutInflater in; Context cont ...
- C#导出GridView数据到Excel文件类
using System; using System.Web; using System.Web.UI; using System.IO; using System.Web.UI.WebControl ...
- 【转】 BSS段 数据段 代码段 堆栈 指针 vs 引用
原文:http://blog.csdn.net/godspirits/article/details/2953721 BSS段 数据段 代码段 堆栈 (转+) 声明:大部分来自于维基百科,自由的百科全 ...