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*去了.... 啥玩意啊这是,他们代码为啥这么长??.... 看完了,...代码怎么写啊?? .....算了,直接看题吧 找 ...
随机推荐
- caffe多任务、多标签
解决的目标问题:多分类问题,比如车辆的外形和颜色,苹果的大小和颜色:多任务:车牌角点的定位和车牌的颜色.定位在技术上属于回归,车牌颜色判断则属于分类. 技术点 caffe默认是单输入任务单标签的,也就 ...
- 以太坊 链私有链环境搭建(windows)
摸索以太坊区块链技术几个月了.最近打算逐步的把自己学到的东西和大家分享一下.在阅读本文之前,希望大家能对区块链的概念能有所了解.这样操作过程中的环节理解更深入.下面开始进入准备.因为本次是window ...
- Android Service总结05 之IntentService
Android Service总结05 之IntentService 版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...
- Mysql(二)函数与连接
一.函数 1.if函数 if(exp1, exp2, exp3) 判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...
- 解题:NOIP 2018 保卫王国
题面 最小支配集=全集-最大独立集 所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态DP模板 GTMDNOIP2018ZTY #include<stack& ...
- “Uncaught TypeError: string is not a function”
http://www.cnblogs.com/haitao-fan/archive/2013/11/08/3414678.html 今天在js中写了一个方法叫做search(),然后点击按钮的时候提示 ...
- SqlParameter防止SQL注入
SQL注入的解决方案有好几种,待我细细研究过之后逐一讲解. 方法一:SqlParameter方法 这里有一篇博客是详细介绍SqlParameter的,可以看看 点我 string sqlStr=&qu ...
- Sql数据库不能频繁连接
这个问题怎么说呢,我频繁的读一个json文件,所以就频繁的去连接了数据库.所以导致了数据库后来就不工作了(罢工?O(∩_∩)O哈哈~) 解决办法是加一个判断语句,如果是空的就连接,否则就别一直连接了. ...
- 机器学习:分类算法性能指标之ROC曲线
在介绍ROC曲线之前,先说说混淆矩阵及两个公式,因为这是ROC曲线计算的基础. 1.混淆矩阵的例子(是否点击广告): 说明: TP:预测的结果跟实际结果一致,都点击了广告. FP:预测结果点击了,但是 ...
- AC自动机(Keywords Search)
题目链接:https://cn.vjudge.net/contest/280743#problem/A 题目大意:首先给你T组测试样例,然后给你n个字符串,最后再给你一个模式串,然后问你这一些字符串中 ...