UVa 11212 Editing a Book (IDA* && 状态空间搜索)
题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n。可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务。每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴。注意,剪贴板只有一个,所以不能连续剪切两次,只能剪切和粘贴交替。例如,为了将{2,4,1,5,3,6}变为升序,可以剪切1将其放到2前,然后剪切3将其放到4前。再如,排列{3,4,5,1,2},只需一次剪切和一次粘贴即可——将{3,4,5}放在{1,2}后,或者将{1,2}放在{3,4,5}前。
分析: 需要搜索的状态都很直接,就是一个数字序列搜索从初始到有序的最短路,加深搜索的关键就是h函数和模拟操作了,h函数定义很厉害,考虑每一个数字的后继,将后继不正确的数量记起来,然后每一次加深搜索(即剪切黏贴操作)不正确后继变正确最多只有3,因为每一次操作,最多只有三个数的后继发生改变,那h函数考虑最优的情况就是记录不正确的后继数,那就最少还需要h/3次才能有序,则h/3 > max_depth - cur_depth则剪枝,至于模拟操作,用两层for循环依次枚举可以剪切的段,然后枚举未剪切的元素,将剪切的部分依次放到这些元素后面。
#include<bits/stdc++.h>
using namespace std;
];
bool Is_sorted()
{
; i<n-; i++)
])//why have =
return false;
return true;
}
int h()
{
;
; i<n-; i++){//!
!= a[i+]) ret++;
}
]!=n) ret++;//!
return ret;
}
int DFS(int depth, int max_depth)
{
+ h() > *max_depth) return false;
if(Is_sorted()) return true;
], Cut_segment[];
memcpy(Old_a, a, sizeof(a));
//!not in here int cnt = 0;
; i<n; i++){
for(int j=i; j<n; j++){
;
; k<n; k++)
if(k<i || k>j) Cut_segment[cnt++] = a[k];//将未剪切部分拼接起来,存到Cut_segment中
//!not in here int cnt2 = 0;
; k<=cnt/*!why have = symbol*/; k++){//枚举将剪切下来的部分放到未被剪切的每一个字符的后面
;
; p<k; p++) a[cnt2++] = Cut_segment[p];//未剪切部分
for(int p=i; p<=j; p++) a[cnt2++] = Old_a[p];//剪切部分放入
for(int p=k; p<cnt/*!*/; p++) a[cnt2++] = Cut_segment[p];//剩下未剪切部分
, max_depth)) return true;
memcpy(a, Old_a, sizeof(a));
}
}
}
return false;
}
inline int solve()
{
;
;
; i<max_depth; i++){//Is begin 0 or 1? 应该是1,因为代表多少次就能sorted,0的情况就是一开始就是sorted了·
//Debug printf("%d\n", i);
, i)) return i;
}
return max_depth;
}
int main(void)
{
;
while(~scanf("%d", &n) && n){
; i<n; i++) scanf("%d", &a[i]);
printf("Case %d: %d\n", t++, solve());
}
;
}
瞎理解的IDA*:
这道题的状态很明显,就是自然段的编号,初始即输入,终止即有序,要求最少步数即最短路,但是这里直接使用之间的BFS进行状态空间搜索会爆炸,因为每一次拓展会发现剪切和黏贴的方式有太多,在规定时间内可能连第一层拓展出来的状态都搜索不完,面对这种情况,是时候使用IDA*了,即避免了BFS的空间状态爆炸,也避免了DFS的盲目性,首先IDA*是一种迭代加深搜索,在我的理解里面就是面对每一次搜索,给定一个深度上限,如果超过这个上限便退出搜索增大上限再搜索一次,这里就避免了太多状态的拓展,然后便是关键的h函数,h函数起到的是在搜索过程中,每一次搜索加深,对于局面都能产生影响,我们利用一个h函数来估计从当前深度到最大深度,如果最优的局面都不能解决问题,则剪枝,因此避免了盲目性,但是如何根据深度的加深去估值,这也是一个难点,不同的估值都会产生不同的效率,所以时间复杂度是个O(迷),听说因此在竞赛中出现的频率不高。
UVa 11212 Editing a Book (IDA* && 状态空间搜索)的更多相关文章
- UVA 11212 Editing a Book [迭代加深搜索IDA*]
11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange the ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- UVA - 11212 Editing a Book (IDA*)
给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...
- UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...
- UVA - 11212 Editing a Book (IDA*搜索)
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...
- UVA 11212 Editing a Book
题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...
- Uva 11212 编辑书稿(迭代加深搜索)
题意: 给定N个数的序列, 希望将它排列成1~N, 可以用剪切.粘贴来完成任务, 每次可以剪切一段连续的自然段, 粘贴时按照顺序粘贴. #include <bits/stdc++.h> # ...
- Editing a Book UVA - 11212 IDA*
You have n equal-length paragraphs numbered 1 to n . Now you want to arrange them in the order of 1 ...
- UVa 1343 The Rotation Game (状态空间搜索 && IDA*)
题意:有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面. 求:使 ...
随机推荐
- hive_server2的权限控制
CDH的core-sit开启: 第一个false表示用系统用户来和hive用户的权限绑定,但经测试并没有生效,所以可以改为true 第二项设置成ALL,表示创建者对其创建的表拥有所有的权限,这样也是比 ...
- 小记---------Hadoop的MapReduce基础知识
MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题 MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算. 两 ...
- python__基础数据类型
字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台 ...
- 【统计】Causal Inference
[统计]Causal Inference 原文传送门 http://www.stat.cmu.edu/~larry/=sml/Causation.pdf 过程 一.Prediction 和 causa ...
- 10.AutoMapper 之自定义值解析器(Custom Value Resolvers)
https://www.jianshu.com/p/3e7cf1d1f17d 自定义值解析器(Custom Value Resolvers) 虽然AutoMapper涵盖了相当多的目标成员映射方案,但 ...
- 深入理解java虚拟机(4)类加载的过程
类加载的过程 ------------------------------------------------------- 0.如下图所示JVM类加载机制分为5个部分:加载.验证.准备.解析.初始化 ...
- redis之使用场景
随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存储数据,可以极大的提高查询性能,对产品在架构上很好的补充.在某些场景下,可以充分的利用 Redis 的特性 ...
- 更新 | 2019年9月计算机二级office模拟题库
随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...
- 扫描全能王 v5.13.0.20190916 去水印和广告版
说明 1.先安装1(安装完不要打开),再安装2,然后打开2,参考下图: 2.不要登录扫描全能王账号,否则会导致失败! 3.激活完成后可以卸载2 下载地址 城通网盘 蓝奏云(仅含1) 百度网盘 另外口袋 ...
- java面试题全集(中)
这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行 ...