uva11212(Editing a Book/编辑书稿)=>IDA*算法/经典的估价函数
来源:互联网 发布:oracle sql trace 编辑:程序博客网 时间:2024/05/01 06:06
题意:将一个数字序列以最少的剪切次数粘贴成另一个数字序列。
解析:本题可用IDA*,也就是设计了估价函数的迭代加深搜索。
IDA*大体上指的是,首先将初始状态结点的H值设为阈值maxH,然后进行深度优先搜索,搜索过程中忽略所有H值大于maxH的结点;如果没有找到解,则加大阈值maxH,再重复上述搜索,直到找到一个解。其中IDA*的减枝策略,每遍历一个深度的时候,进行判断:
当前局面的估价函数值 + 当前深度 > 预定义最大搜索深度
下面进行这道题的减枝的分析(也叫做启发函数),当你改变一个区间的位置,你会改变3个数的位置的正确性
比如 1,2,3,4,5,6.序列,你把2,3移动到6后面,那么1的后面变成了5, 而 6的后面编程了2,而3的后面变成 空了,所以每次移动一个区间,最多可以改变3个数的正确性,也就是说,对于这道题如果遍历到了一个深度, (还能遍历的深度 - 当前深度) *3< 不正确数字的个数,那么就没有必要继续遍历了,因为往后你就是全把这些数字该对了也无法达到理想状态。
代码如下:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 10;int n,a[maxn];int is_sorted(){for(int i=1;i<=n;i++) if(a[i]!=i) return false;return true;}inline int h(){int cnt=0;for(int i=1;i<n;i++) if(a[i+1]!=a[i]+1) cnt++;if(a[n]!=n) cnt++;return cnt;}//找出后继不正确的数字个数hbool dfs(int d,int maxd){if(3*d+h()>3*maxd) return false;//估价函数if(is_sorted()) return true;int olda[maxn],b[maxn];for(int i=1;i<=n;i++) olda[i]=a[i];//需要另一个数组来保存原来的数组for(int i=1;i<=n;i++)//枚举起始点 for(int j=i;j<=n;j++){//枚举终止点 //剪切 int cnt=1; for(int k=1;k<=n;k++) if(k<i||k>j) b[cnt++]=olda[k]; //在K前插入 for(int k=0;k<cnt;k++){ int cnt2=1; for(int p=1;p<=k;p++) a[cnt2++]=b[p];//插入起始点前的部分 for(int p=i;p<=j;p++) a[cnt2++]=olda[p];//插入 for(int p=k+1;p<cnt;p++) a[cnt2++]=b[p];//插入终止点后的部分 if(dfs(d+1,maxd)) return true; }}return false;}int solve(){if(is_sorted()) return 0;int max_ans=5;for(int maxd=1;maxd<max_ans;maxd++){ if(dfs(0,maxd))return maxd;}return max_ans;}int main(){ int kase=1; while(scanf("%d",&n)==1 && n){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("Case %d: %d\n",kase++,solve()); } return 0;}
1 0
- uva11212(Editing a Book/编辑书稿)=>IDA*算法/经典的估价函数
- UVa11212 编辑书稿(Editing a book)
- Uva11212 编辑书稿(Editing a book,IDE算法)
- UVA11212 Editing a Book (IDA*)
- UVa11212 - Editing a Book
- Uva11212 Editing a Book【IDA*】【例题7-10】
- 迭代加深搜索--IDA*--uva11212 Editing a book
- 11212 - Editing a Book(IDA*算法)
- UVa 11212 Editing a Book (编辑书稿)迭代加深
- 例题7-10 编辑书稿(Editing a Book, UVa 11212)
- uva 11212 UVa11212 Editing a Book
- UVa 11212 - Editing a Book(IDA*)
- UVa 11212:Editing a Book(IDA*)
- UVA-11212 Editing a Book (IDA*)
- UVA-11212 Editing a Book (IDA*)
- 紫书 例题7-10 编辑书稿 UVa11212 IDA*
- UVa 11212 - Editing a Book <状态空间搜索+IDA*算法>
- 【UVA】11212-Editing a Book(IDA*搜索减枝)
- 测测
- UVa 11212 Editing a Book (编辑书稿)迭代加深
- 有一种生物叫做程序员。。。。
- Javascript基础入门
- 恭贺文化部中国文化网隆重上线
- uva11212(Editing a Book/编辑书稿)=>IDA*算法/经典的估价函数
- acm 4 1001
- 解析xml文件的几种技术与Dom4j与sax之间的对比
- 4-7 统计某类完全平方数 (20分)
- PHP基础知识系统复习
- 网络通信之 字节序转换原理与网络字节序、大端和小端模式
- js中class的点击事件没有效果
- window平台安装 MongoDB
- 【NOIP2013模拟】期望异或&&【NOI2015模拟9.7】大新闻