7-10Editing aBook uva11212(迭代加深搜索 IDA*)
题意: 给出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*)的更多相关文章
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- 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 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- 埃及分数问题 迭代加深搜索/IDA*
输入整数a,b (0<a<b<500) ,输出最佳表达式 使得加数个数尽量小,如果加数个数相同,则最小的分数越大越好 ,输出表达式 考虑从小到大枚举深度上限maxd,每次执行只考虑深 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- hdu 1560 DNA sequence(迭代加深搜索)
DNA sequence Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- UVA11212-Editing a Book(迭代加深搜索)
Problem UVA11212-Editing a Book Accept:572 Submit:4428 Time Limit: 10000 mSec Problem Description ...
- 迭代加深 A* IDA* 初探
并没有有用的东西, 只是用来水的. 今天看搜索,想起来了A*和IDA* 看A*去了.... 啥玩意啊这是,他们代码为啥这么长??.... 看完了,...代码怎么写啊?? .....算了,直接看题吧 找 ...
随机推荐
- 【BZOJ4870】组合数问题(动态规划,矩阵快速幂)
[BZOJ4870]组合数问题(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 显然直接算是没法做的.但是要求的东西的和就是从\(nk\)个物品中选出模\(k\)意义下恰好\(r\)个物品的方案数 ...
- 解决 winform 界面对不齐
最近做了一个winform的程序,本机上界面对得很齐,到一到客户的机器上就惨不忍睹,一番研究后搞定: 1. AutoScaleMode = None 2. BackgroundImageLayout ...
- Chart Controls 简介与下载
虽然博客园已有人介绍过了,还是忍不住介绍一下微软这套免费又功能强大的图表控件「Microsoft Chart Controls for Microsoft .NET Framework 3.5」.本帖 ...
- java字符数组char[]和字符串String之间的转换
java字符数组char[]和字符串String之间的转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用String.valueOf()将字符数组转换成字符串 void (){ cha ...
- jQuery 实现 bootstrap 模态框 删除确认
思路: 点击删除按钮,通过jquery将删除操作的URL赋值到页面URL元素,并弹出会话框 用户点击确认,通过jquery获取URL,并发送删除请求至后台. 一.删除button <a clas ...
- Codeforces 543 B. World Tour
http://codeforces.com/problemset/problem/543/B 题意: 给定一张边权均为1的无向图. 问至多可以删除多少边,使得s1到t1的最短路不超过l1,s2到t2的 ...
- WebSlides - 轻松制作漂亮的 HTML 幻灯片(演讲稿)
WebSlides 是一个开源的 HTML 幻灯片项目,能够帮助熟悉前端语言的开发者快速制作出效果精美的幻灯片.页面中的每个 <section> 都是一个独立的幻灯片,只需要很少的 CSS ...
- 以后的博客将更新到自己的域名pythonsite.com,欢迎访问
以后的博客将更新到自己的域名pythonsite.com,欢迎访问
- 【项目部署】部署项目以war包部署和解开以目录部署的区别
我们都知道最简单的部署web项目的方式是打成war包直接仍在tomcat的webapps目录下,我上个项目也确实是这样做的,可是这给我们后期的维护带来了极大的不便,下面就简单研究一下以war包部署和解 ...
- free vmstat查看内存及系统调优【转】
内存查看 查看内存是否存在瓶颈,使用top指令看比较麻烦,而free命令更为直观: [/home/weber#]free total used free shared buffers cached M ...