题意:  给出n( 2<=n<=9) 个乱序的数组  要求拍成升序  每次 剪切一段加上粘贴一段算一次  拍成1 2 3 4 .。。n即可     求排序次数

典型的状态空间搜索问题   初始状态为输入  结束状态为升序

分析: 因为n最大为就  排列最多为9!=362880个  虽软这个数字不是很大 但是每次剪切都可能不是一个数组 所以枚举量还要大大增加   所以肯定要优化

这里用到了迭代加深搜索: 最大次数为9   所以将次数从0开始枚举   直到首先找到一个最小的答案

迭代加深搜索其实和暴力算法没什么两样  但是重要的是找到启发函数(剪枝)  这个剪枝很重要  大大缩短时间

这题可得启发函数:   d为深度  h为不正确的数组  maxx为当前次数

可证明(见紫书)每一次操作  h最多减少三   本来是   d+h<=maxx 时可以成立

现在有方程   3d+h>3maxx 时剪枝

启发函数就是和迭代加深搜索一起用 起到大量剪枝的作用

#include<bits/stdc++.h>
using namespace std;
#define N 9
int n,a[N]; bool judge(void)
{
for(int i=;i<n-;i++)
if(a[i]>=a[i+])return ;
return ;
} int h(void)
{
int cnt=;
for(int i=;i<n-;i++)
if(a[i]+!=a[i+])cnt++;
if(a[n-]!=n)cnt++;
return cnt;
} bool dfs(int d,int maxx)
{
if(*d+h()>*maxx)return false;
if(judge())return true;
int olda[N],b[N];
memcpy(olda,a,sizeof a);
for(int i=;i<n;i++)
for(int j=i;j<n;j++)
{
int cnt2=;
for(int k=;k<n;k++)
if(k<i||k>j)b[cnt2++]=a[k]; for(int k=;k<=cnt2;k++)
{
int cnt=;
for(int p=;p<k;p++)a[cnt++]=b[p];
for(int p=i;p<=j;p++)a[cnt++]=olda[p];
for(int p=k;p<cnt2;p++)a[cnt++]=b[p];
if(dfs(d+,maxx))return ;
memcpy(a,olda,sizeof a);
}
}
return ;
} int solve(void)
{
if(judge())return ;
for(int maxx=;maxx<=;maxx++)
if (dfs(,maxx) ) return maxx;
} int main()
{
int cas=;
while(scanf("%d",&n),n)
{
for(int i=;i<n;i++)scanf("%d",&a[i]);
printf("Case %d: %d\n",++cas,solve());
}
}

7-10Editing aBook uva11212(迭代加深搜索 IDA*)的更多相关文章

  1. 埃及分数 迭代加深搜索 IDA*

    迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...

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

  3. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

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

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

  5. 埃及分数问题 迭代加深搜索/IDA*

    输入整数a,b (0<a<b<500) ,输出最佳表达式 使得加数个数尽量小,如果加数个数相同,则最小的分数越大越好 ,输出表达式 考虑从小到大枚举深度上限maxd,每次执行只考虑深 ...

  6. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

  7. hdu 1560 DNA sequence(迭代加深搜索)

    DNA sequence Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  8. UVA11212-Editing a Book(迭代加深搜索)

    Problem UVA11212-Editing a Book Accept:572  Submit:4428 Time Limit: 10000 mSec  Problem Description ...

  9. 迭代加深 A* IDA* 初探

    并没有有用的东西, 只是用来水的. 今天看搜索,想起来了A*和IDA* 看A*去了.... 啥玩意啊这是,他们代码为啥这么长??.... 看完了,...代码怎么写啊?? .....算了,直接看题吧 找 ...

随机推荐

  1. 前端学习 -- Css -- 文本样式

    text-transform可以用来设置文本的大小写 可选值: none 默认值,该怎么显示就怎么显示,不做任何处理 capitalize 单词的首字母大写,通过空格来识别单词 uppercase 所 ...

  2. java保留两位小数和js保留两位小数一致性研究

    一.java保留两位小数方式 public static void main(String[] args) { System.out.println("=======DecimalForma ...

  3. js验证4位数字

    var reg = /^\d{4}$/; var str = "0001"; reg.test(str);

  4. What does -1 mean in numpy reshape?

    The criterion to satisfy for providing the new shape is that 'The new shape should be compatible wit ...

  5. Python内置函数之匿名(lambda)函数

    Python内置函数之匿名(lambda)函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数 #!/usr/bin/env python #_*_coding:utf ...

  6. vue.js react.js angular.js三者比较

    react和vue有许多相似之处,他们都有:1.使用虚拟DOM2.提供了响应式(reactive)和组件化(composable)的视图组件3.将注意力集中保持在核心库,而将其他功能如路由和全局状态管 ...

  7. Spark记录-Spark作业调试

    在本地IDE里直接运行spark程序操作远程集群 一般运行spark作业的方式有两种: 本机调试,通过设置master为local模式运行spark作业,这种方式一般用于调试,不用连接远程集群. 集群 ...

  8. jQuery 实现 bootstrap 模态框 删除确认

    思路: 点击删除按钮,通过jquery将删除操作的URL赋值到页面URL元素,并弹出会话框 用户点击确认,通过jquery获取URL,并发送删除请求至后台. 一.删除button <a clas ...

  9. bzoj千题计划253:bzoj2154: Crash的数字表格

    http://www.lydsy.com/JudgeOnline/problem.php?id=2154 #include<cstdio> #include<algorithm> ...

  10. zsh与oh-my-zsh是什么

    zsh是bash的增强版,其实zsh和bash是两个不同的概念.zsh更加强大. 通常zsh配置起来非常麻烦,且相当的复杂,所以oh-my-zsh是为了简化zsh的配置而开发的,因此oh-my-zsh ...