Editing a Book 搜索 + meet in the middle
我们可以发现最多只会进行5次操作。
由此我们从双向跑dfs,用一个unordered_map来保存状态,枚举一下两边的深度即可。
如果4次仍然不可行,则只有可能是5次。所以正反最多只需要搜2层
code:
#include<cstdio>
#include<tr1/unordered_map>
#include<algorithm>
#include<queue>
using namespace std;
using namespace std :: tr1;
unordered_map<long long ,int>F[3];
queue<long long>Q;
int n, A[20], w[20];
int getnext(int arr[],int cur)
{
while(cur < n && arr[cur+1] == arr[cur] + 1)++cur;
return cur;
}
long long get(int arr[])
{
long long tmp = 0;
for(int i = 1;i <= n; ++i)
{
tmp = tmp * 10 + arr[i];
}
return tmp;
}
int dfs(int cur,int target,int arr[],int ty)
{
if(cur == target)
{
long long fin = get(arr);
F[ty][fin] = -1;
Q.push(fin);
if(F[ty^1][fin] == -1) return 1;
return 0;
}
int h[12];
for(int lefts = 1;lefts <= n; ++lefts)
{
for(int rights = lefts; rights <= n; ++rights)
{
int pos = 0;
for(int fronts = 1; fronts < lefts; ++fronts)
{
pos = 0;
for(int i = 1; i < fronts; ++i) h[++pos] = arr[i];
for(int i = lefts; i <= rights ;++i) h[++pos] = arr[i];
for(int i = fronts;i < lefts; ++i) h[++pos] = arr[i];
for(int i = rights + 1; i <= n; ++i)h[++pos] = arr[i];
if(dfs(cur + 1,target,h,ty)) return 1;
}
for(int backs = rights + 1; backs <= n; ++backs)
{
pos = 0;
for(int i = 1;i < lefts; ++i) h[++pos] = arr[i];
for(int i = rights + 1;i <= backs; ++i)h[++pos] = arr[i];
for(int i = lefts; i <= rights ;++i)h[++pos] = arr[i];
for(int i = backs + 1;i <= n; ++i)h[++pos] = arr[i];
if(dfs(cur + 1, target,h,ty))return 1;
}
}
}
return 0;
}
int main()
{
int cas = 0;
while(1)
{
scanf("%d",&n);
if(!n)break;
for(int i = 1;i <= n;++i)
{
scanf("%d",&A[i]);
w[i] = A[i];
}
sort(w + 1, w + 1 + n);
if(getnext(A,1) == n)
{
printf("0\n");
continue;
}
while(!Q.empty())
{
F[0][Q.front()] = 0, F[1][Q.front()] = 0;
Q.pop();
}
F[1][get(w)] = -1;
if(dfs(0,1,A,0))printf("1\n");
else if(dfs(0,1,A,0) || dfs(0,1,w,1))printf("2\n");
else if(dfs(0,2,A,0) || dfs(0,1,w,1))printf("3\n");
else if(dfs(0,2,A,0) || dfs(0,2,w,1))printf("4\n");
else printf("5\n");
}
return 0;
}
Editing a Book 搜索 + meet in the middle的更多相关文章
- 折半搜索(meet in the middle)
折半搜索(meet in the middle) 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 这个 ...
- Meet in the middle
搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship Meet in the Middle
[BZOJ4800][Ceoi2015]Ice Hockey World Championship Description 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. Input 第一 ...
- Meet in the middle算法总结 (附模板及SPOJ ABCDEF、BZOJ4800、POJ 1186、BZOJ 2679 题解)
目录 Meet in the Middle 总结 1.算法模型 1.1 Meet in the Middle算法的适用范围 1.2Meet in the Middle的基本思想 1.3Meet in ...
- 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)
A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...
- meet in the middle 复习笔记
前言 若干年前看过现在又忘了.这么简单都忘 所以今天来重新复习一下. 正题 考虑这样的问题: 给定 \(n\) 个物品的价格,你有 \(m\) 块钱,每件物品限买一次,求买东西的方案数. \(n\le ...
- 浅谈Meet in the middle——MITM
目测观看人数 \(0+0+0=0\) \(\mathrm{Meet\;in\;the\;middle}\)(简称 \(\rm MITM\)),顾名思义就是在中间相遇. 可以理解为就是起点跑搜索树基本一 ...
- SPOJ4580 ABCDEF(meet in the middle)
题意 题目链接 Sol 发现abcdef是互不相关的 那么meet in the middle一下.先算出abc的,再算def的 注意d = 0的时候不合法(害我wa了两发..) #include&l ...
随机推荐
- Linux拖拽上传文件 lrzsz
首先安装lrzsz 命令为:yum install lrzsz 安装完毕后直接将.tar.gz格式的文件拖如xshell的窗口内就会自动上传.
- cxdbtreelist的处理点滴
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAuAAAAE8CAIAAAAOqJOXAAAgAElEQVR4nOy9eXAcV37n+bwzf21sbO ...
- Tkinter之输入框操作
昨天看好的,更新一下记录而已. #coding: utf8 from Tkinter import * def reg(): s1 = e1.get() s2 = e2.get() t1 = len( ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- redis安装配置-linux
wget http://download.redis.io/releases/redis-3.2.9.tar.gz .tar.gz cd redis-/ make --启动 ./redis-serve ...
- maven 自动部署到tomcat
使用maven的自动部署功能可以很方便的将maven工程自动部署到远程tomcat服务器,减少部署时间,方便快捷. 一.配置tomcat manager 1.编辑tomcat目录下,conf/tomc ...
- Android获取设备屏幕宽高像素值的两个方法
private void get1() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDi ...
- Java使用JAVE获取MP4播放时长
- Github Pages 建立过程记录
之前建立过一个測试页面. 如今在折腾CreateJS 试着把离线版的文档传到github pages上面. 第一步:创建Repository 第二步:本地初始化 主要命令:git init 第三步:复 ...
- 自己定义控件三部曲之动画篇(七)——ObjectAnimator基本使用
前言: 假如生活欺骗了你, 不要悲伤,不要心急! 忧郁的日子里须要镇静: 相信吧,快乐的日子终将会来临! 心儿永远向往着未来: 如今却常是忧郁. 一切都是瞬息,一切都将会过去: 而那过去了的,就会成为 ...