UVA11212 EditingaBook ( IDA*搜索)】的更多相关文章

首先说说IDS,就DFS限定一个层数上限maxd,如果在maxd范围内没有找到解,就增加maxd,继续搜索. 当访问到当前结点u时,估计还要搜索h(u)层,如果h(u)+当前层数d>maxd的时候就剪枝,这就是IDA*. IDA*属于DFS,当状态空间某一层的结点数无穷大时,BFS失效,只能DFS. 相比BFS,它的空间占用少(不需要判重复),时间效率也不低. 注意:A*的关键在于选取估价函数h(). ----------------------------------分割线----------…
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS 验证在当前枚举的步数之内能否到达目标状态. 如果不能到达,就枚举下一个步数,重新搜索,即使某些状态在之前的 DFS 中已经搜索过,我们仍然搜索. 并且在一次 DFS 中,我们不需要判定重复的状态. 在 IDA* 中,重要的剪枝优化是 估价函数 ,将一些不可能存在可行解的枝条剪掉. 如果估价函数写得…
用N个串中找到最短的公共串(不要求连续,仅仅要相对位置一样就可以) 迭代加深搜索就可以 剪枝:当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回. #include "stdio.h" #include "string.h" const char ch[10]="ATCG"; int deep,n; char s[10][10]; int pos[10];//记录第i个序列正在使用第几个位置 int Max(int a,int b)…
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA*来求解这个题目,首先每步操作最多可以减少3个位置错误的数字如下图(假设操作之后a.b.c都位于正确的位置) 则启发函数可以为3*cur+h > maxd*3,其中cur是枚举到当前的操作次数,h是序列中位置不对的数字个数,maxd是枚举到的答案. 可以用两重循环枚举选取的区间,然后枚举将其放到的位置,d…
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<vector> #include<map> #include<set> #include<algorithm> #include<queue> #include<stack> #include<sstream> #inc…
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若在maxn范围内未找到解,则++maxn,直到找到解.对于每个当前深度deep,若还需要搜索m层才能找到解,而deep+m>maxn,则剪枝. 2.对于本题,选取估价函数,若当前深度下,后继不正确的数字个数是m,则还需要m/3层才能找到解.即若deep+m/3>maxn则剪枝. 3.不断枚举剪切片…
参考: http://www.itdadao.com/articles/c15a190757p0.html 一. 为什么要调试init_array init_array的用途 1. 一些全局变量的初始化 (我这里试过, 一些全局变量的初始化,会统一用一个init_array表项来完成初始化) 2. 通过__attribute__ ((constructor)) 声明的函数 (可以定义n个) 通过so加载流程来看,init_array是我们程序代码可以控制的最早的时机了, 其次才加载Jni_onl…
1.codevs1288 题意:对于一个分数a/b(a!=1),将它表示为1/x + 1/y + 1/z ……的形式,x,y,z……互不相同 多解取加数少的,加数相同时,取最小的分数最大的. 思路:经典基础IDA* 搜索无指定界限所以手动规定.因为要求分母尽量小,所以先找最小分母做下界然后规定层数迭代搜 ans存分母 因为从小到大依次搜,层数加深,第一次找到的一定最优. 估价函数:若扩展到i层时,前i个分数之和为c/d,第i个分数为1/e因为分母递增,所以接下来至少还需要>(a/b-c/d)/(…
1288 埃及分数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越 好. 如: 19/45=1/3 + 1/12 + 1/180…
题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数字相同.(建议看下题目中的图就懂啦). IDA*搜索. 我是干脆用结构体保存搜索状态(当然这样很占空间了,可能也耗时间,不过这题15s/150M的时空限制我也是醉了).保存一个board temp,一个搜索路径path,搜索深度n,以及一个内置的估值函数h().h()返回的是8减这八个方块上出现最多…