poj3134 Power Calculus IDA*】的更多相关文章

好端端的一道搜索题目,,,硬生生的被我弄成了乱搞题,,,枚举当前的maxd,深搜结果,然而想到的剪枝方法都没有太好的效果,,,最后用一个贪心乱搞弄出来了,,, 贪心:每次必用上一次做出来的数字与其他数字组合得到结果. #include <cstdio> #include <algorithm> #include <cstring> #include <vector> //#define debug int n; int maxd; ]; ]; bool ch…
题目大意: 用最小的步数算出  x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A*   就是如果这个数一直平方  所需要的步骤数都不能达到最优   就剪掉 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <vector> using namespace std…
题目描述: 你现在有x^1,每动一步可以用当前存在的x^a和x^b获得x^(a+b)或x^(abs(a-b)).给出n(n<=1000),求最少多少步能得到x^n. 题解: IDDFS.枚举步数,然后dfs+剪枝. 剪枝: 1.目标高于上限时减掉: 2.当前存在两个>n或以上时减掉. 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define…
原题:1374 - Power Calculus 题意: 求最少用几次乘法或除法,可以从x得到x^n.(每次只能从已经得到的数字里选择两个进行操作) 举例: x^31可以通过最少6次操作得到(5次乘,1次除) x^2 = x*x x^4 = (x^2)*(x^2) x^8 = (x^4)*(x^4) x^16 = (x^8)*(x^8) x^32 = (x^16)*(x^16) x^31 = (x^32)÷x 分析: 可以看到,每次从已得到的数字中选取两个操作,这样就有了枚举的思路. 这道题又是…
SP7579 YOKOF - Power Calculus 迭代加深搜索 DFS每次选定一个分支,不断深入,直至到达递归边界才回溯.这种策略带有一定的缺陷.试想以下情况:搜索树每个节点的分支数目非常多,并且问题的答案在某个较浅的节点上.如果深搜在一开始选错了分支,就很可能在不包含答案的深层子树上浪费许多时间 此时,我们可以从小到大限制搜索的深度,如果在当前深度限制下搜不到答案,就把深度限制增加,重新进行一次搜索,这就是迭代加深思想. 虽然该过程在深度限制为d时,会重复搜索第1~d-1层的节点,但…
废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己,以及乘或除运算过程中产生的中间结果)变成x^n的最少步数 输入格式: 若干行数据,每行一个正整数n,数据以单独成行的0结束 输出格式: 若干行数据,对应每行输入的n所需的步数 题目描述 Starting with x and repeatedly multiplying by x, we can c…
题意:给定一个数n,让你求从1至少要做多少次乘除才可以从 x 得到 xn. 析:首先这个是幂级的,次数不会很多,所以可以考虑IDA*算法,这个算法并不难,难在找乐观函数h(x), 这个题乐观函数可以是当前最大数*2maxd - d 小于n,回溯.很好理解,最大的数再一直乘2都达不到,最终肯定达不到. 再就是应该先试乘再试除,还有不要出现负整数.我测了不少知道应该是13次最多,所以这也是一个优化. 为了追求速度,也可以先1~1000的数打表. 代码如下: #include <iostream>…
题目 题目     分析 IDA*大法好,抄了lrj代码.     代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxans=14; int n,a[maxans+1]; bool dfs(int d,int maxd) { if(a[d] == n) return true; if(d == maxd) return false;…
本题代码如下: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int step,n; ]; bool dfs(int d,int maxd)///d即是所走步数 { if(pow[d]==n) { printf("%d\n",d); return true; } if(d==maxd) return false; ]; ; i <= d;…
解题思路: 这是一道以快速幂计算为原理的题,实际上也属于求最短路径的题目类型.那么我们可以以当前求出的幂的集合为状态,采用IDA*方法即可求解.问题的关键在于如何剪枝效率更高.笔者采用的剪枝方法是: 1)如果当前状态幂集合中的最大元素max满足 max*2^(maxd-cur_d)<n,则剪枝.原因是:在每一次状态转移后,max最多增大一倍.(maxd-cur_d)次转移之后,max最多变成原来的2^(maxd-cur_d)倍,然而如果当前状态的极限情况下仍有max<n,则当前状态结点一定无法…