UVA-11212 Editing a Book (IDA*)】的更多相关文章

题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA*来求解这个题目,首先每步操作最多可以减少3个位置错误的数字如下图(假设操作之后a.b.c都位于正确的位置) 则启发函数可以为3*cur+h > maxd*3,其中cur是枚举到当前的操作次数,h是序列中位置不对的数字个数,maxd是枚举到的答案. 可以用两重循环枚举选取的区间,然后枚举将其放到的位置,d…
题目 题目     分析 get一下IDA*的技巧,感觉总体来说不难,主要是剪枝比较难想. 这是lrj的代码,比较通俗易懂,关键就是选定一个区间再取出来,插入到一个位置,接下来转移到这个状态.     代码 #include <bits/stdc++.h> using namespace std; const int maxn=10; int n,a[maxn]; bool is_sorted() { for(int i=0;i<n-1;i++) if(a[i]>=a[i+1])…
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若在maxn范围内未找到解,则++maxn,直到找到解.对于每个当前深度deep,若还需要搜索m层才能找到解,而deep+m>maxn,则剪枝. 2.对于本题,选取估价函数,若当前深度下,后继不正确的数字个数是m,则还需要m/3层才能找到解.即若deep+m/3>maxn则剪枝. 3.不断枚举剪切片…
[题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也觉得慌= = [其实看到这题不应该想到宽搜么??? 全排列只有9!=362880个 这题的IDA*的估价函数特别机智: n<=9,最多2需要8步,深度上限为8. 考虑后继不正确的赎回自个数h,可以证明每次剪切时候h最多减少3,因此当3*d+h>3*maxd时可以剪枝. [证明上面那个画一下就知道,…
题目大意:将一个数字序列以最少的剪切次数粘贴成另一个数字序列. 题目分析:很显然,最坏的情况是需要n-1次剪切,搜索层数不多,但每一层的状态数目又非常庞大,适宜使用IDA*.考虑每一个序列后续不正确的数字个数h,每一次剪切最多3个数字后续数字发生改变,每次剪切最多可减少3个不正确的后续数字.所以在当前层d,最大层maxd时,最多可减少的不正确后续数字是3*(maxd-d),若h>3*(maxd-d),则剪枝,整理一下便是<入门经典>上的估价函数了. 代码如下: # include<…
题目 题目     分析 IDA*大法好,抄了lrj代码.     代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxans=14; int n,a[maxans+1]; bool dfs(int d,int maxd) { if(a[d] == n) return true; if(d == maxd) return false;…
uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题算比较难的贪心了.解法是维护一个关于所有选择的时间的大根堆.将所有工作按照截止时间排序(将二维问题转化为一维问题),然后依次考虑每一个工作.如果当前的总时间t,加上当前工作的时间t1,小于等于当前工作的截止时间d1,那么直接把当前工作加入大根堆中.如果t+t1>d1,说明如果做这个工作,就超时了,所…
11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange them in the order of 1, 2, . . . , n. With the help of a clipboard, you can easily do this: Ctrl-X (cut) and Ctrl-V (paste) several times. You cannot cut…
题意:你有一篇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}前. 分析…
题意:从起点出发,可向东南西北4个方向走,如果前面没有墙则可走:如果前面只有一堵墙,则可将墙向前推一格,其余情况不可推动,且不能推动游戏区域边界上的墙.问走出迷宫的最少步数,输出任意一个移动序列. 分析: 1.最少步数--IDA*. 2.注意,若此墙可推动,必须改变当前格子,和沿当前格子向前一步的格子的墙的标记. 3.若沿当前格子向前两步的格子存在,则这个格子的墙的标记也要改变.不存在的情况是:把墙推向了边界. 4.因为每个格子的值是是1(如果正方形以西有一个墙),2(北),4(东)和8(南)的…