题目:

给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置。问最少经过多少次操作可将序列变为1,2,3……n。

思路:

利用IDA*来求解这个题目,首先每步操作最多可以减少3个位置错误的数字如下图(假设操作之后a、b、c都位于正确的位置)

则启发函数可以为3*cur+h > maxd*3,其中cur是枚举到当前的操作次数,h是序列中位置不对的数字个数,maxd是枚举到的答案。

可以用两重循环枚举选取的区间,然后枚举将其放到的位置,dfs知道序列符合题意。

代码:

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define MAX 1000000009
  4. #define FRE() freopen("in.txt","r",stdin)
  5. #define FRO() freopen("out.txt","w",stdout)
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxn = ;
  9. int n;
  10.  
  11. bool isSrot(int* buf){//判断是不是序列符合题意
  12. for(int i=; i<n-; i++){
  13. if(buf[i]>=buf[i+])
  14. return false;
  15. }
  16. return true;
  17. }
  18.  
  19. int ErrorNum(int* buf){//输出位置不对的数字个数
  20. int cnt = ;
  21. for(int i=; i<n-; i++){
  22. if(buf[i]+!=buf[i+])
  23. cnt++;
  24. }
  25. return cnt;
  26. }
  27.  
  28. void numSwap(int* buf,int* original,int s,int t,int pos){//将区间放到指定的位置
  29. int idx=;
  30. for(; idx<pos; idx++){
  31. buf[idx] = original[idx];
  32. }
  33.  
  34. for(int i=s; i<t; i++){//将操作的区间放入buf数组
  35. buf[idx++] = original[i];
  36. }
  37. for(int i=pos; i<n; i++){//将剩余部分补全
  38. if(i<s || i>=t){
  39. buf[idx++] = original[i];
  40. }
  41. }
  42. }
  43.  
  44. bool dfs(int cur,int maxd,int* a){
  45. if(*cur+ErrorNum(a)>*maxd) return false;
  46. if(isSrot(a)) return true;
  47.  
  48. int temp[];
  49. for(int s=; s<n; s++){//这两重循环是用来枚举剪切的区间的长度
  50. for(int t=s+; t<=n; t++){
  51. for(int pos=; pos<s; pos++){//枚举区间要放入的位置,只要放到s之前就可以枚举所有的情况
  52. //别的地方也不符合实际情况啊,做的时候写成了pos<n,结果一直T
  53. numSwap(temp, a, s, t, pos);
  54. if(dfs(cur+, maxd, temp))
  55. return true;
  56. }
  57. }
  58. }
  59. return false;
  60. }
  61.  
  62. int main(){
  63. //FRE();
  64. int kase = ,a[];
  65. while(scanf("%d",&n) && n){
  66. for(int i=; i<n; i++){
  67. scanf("%d",&a[i]);
  68. }
  69.  
  70. for(int i=; i<=n; i++){
  71. if(dfs(,i,a)){
  72. printf("Case %d: %d\n",++kase,i);
  73. break;
  74. }
  75. }
  76. }
  77. return ;
  78. }

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

  1. UVa 11212 Editing a Book (IDA* && 状态空间搜索)

    题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...

  2. UVA - 11212 Editing a Book (IDA*)

    给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...

  3. 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 ...

  4. UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)

    题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...

  5. uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索

    迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...

  6. UVA 11212 Editing a Book

    题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...

  7. 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 ...

  8. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  9. UVA - 10118Free Candies(记忆化搜索)

    题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...

随机推荐

  1. go3--常量和类型转换

    /* Go中不存在隐式转换,所有类型转换必须显式声明 转换只能发生在两种相互兼容的类型之间 类型转换的格式: <ValueA> [:]= <TypeOfValueA>(< ...

  2. 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2)V - Gears

    Problem V | limit 4 secondsGearsA set of gears is installed on the plane. You are given the center c ...

  3. html5 canvas程序演示--P1197 [JSOI2008]星球大战

    html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...

  4. CSU 1806 Toll 自适应simpson积分+最短路

    分析:根据这个题学了一发自适应simpson积分(原来积分还可以这么求),然后就是套模板了 学习自适应simpson积分:http://blog.csdn.net/greatwall1995/arti ...

  5. 【Dairy】2016.11.5

    橘子洲一游

  6. PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers错误

    安装mysql8.0之后,尝试使用php连接mysql,总是报PDO::__construct(): Server sent charset (255) unknown to the client. ...

  7. P4460 [CQOI2018]解锁屏幕

    算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...

  8. 二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment

    题目传送门 /* 题意:问有几个区间最大值-最小值 < k 解法1:枚举左端点,二分右端点,用RMQ(或树状数组)求区间最值,O(nlog(n))复杂度 解法2:用单调队列维护最值,O(n)复杂 ...

  9. Hbase源码分析:RPC概况

    RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带.了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础.因为了解了hbase的rpc机制能 ...

  10. EasyUI系列学习(九)-Panel(面板)

    一.加载方式 1.class加载 <div class="easyui-panel" title="面板一" style="width:500p ...