题意:给你个数n 让你求从x出发用乘除法最少多少步算出x^n。

思路:

一看数据范围 n<=1000 好了,,暴搜。。

但是 一开始写的辣鸡暴搜 样例只能过一半。。 大数据跑了10分钟才跑出来。。。

看来是要加剪枝了。

剪枝1:

我们可以知道 如果花k步得到了一个数m,那么如果比k步多q步才得到m,,这肯定不是最优解。

原因:

得到m最优解的路径上在q步内总能组合出在k+q步得到m的路径上的所有值。

剪枝2:

剪枝2是在剪枝1之上的。。。 因为我们用的是迭代加深搜索,不用每次清空这个最小值数组了。

剪枝3:(但是剪枝3很弱,只有15ms的优化效果)

我们可以用看二进制最高位的方法求出一个下界,每回从下界开始搜索就好了。

有人用答案在12以内时 ID-DFS,(因为程序的效率差), 如果没有得出答案,直接贪心输出13.。。。

这种 情况 我只能说 你RP真好。。。

版本1:

Problem: 3134 User: 2553015307

Memory: 176K Time: 4125MS

Language: C++ Result: Accepted

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,T,s[33],flag,vis[2048];
void dfs(int t){
if(t==T+1){if(s[t]==n)flag=1;return;}
for(int i=1;i<=t;i++){
int tempx=s[t]+s[i],tempy=s[t]-s[i],temp=T-t+1;
if(tempx<<(temp)>=n&&tempx<2048&&t<=vis[tempx])vis[tempx]=t,s[t+1]=tempx,dfs(t+1);
if(tempy<<(temp)>=n&&tempy>0&&t<=vis[tempy])vis[tempy]=t,s[t+1]=tempy,dfs(t+1);
}
}
int main(){
while(scanf("%d",&n)&&n){
flag=0,s[1]=1;
for(T=0;;T++){
memset(vis,0x3f,sizeof(vis)),dfs(1);
if(flag){printf("%d\n",T);break;}
}
}
}

每回清空vis数组,,卡时过的。

终极版:

#include <cstdio>
#include <cstring>
using namespace std;
int n,T,s[33],flag,vis[2048];
bool dfs(int t){
if(t==T+1){if(s[t]==n)return 1;return 0;}
for(int i=1;i<=t;i++){
int tempx=s[t]+s[i],tempy=s[t]-s[i],temp=T-t+1;
if(t<=vis[tempx]&&tempx<<temp>=n&&tempx<2048){vis[tempx]=t,s[t+1]=tempx;if(dfs(t+1))return 1;}
if(tempy>0&&t<=vis[tempy]&&tempy<<temp>=n){vis[tempy]=t,s[t+1]=tempy;if(dfs(t+1))return 1;}
}
return 0;
}
int main(){
while(scanf("%d",&n)&&n){
memset(vis,0x3f,sizeof(vis)),vis[1]=T=flag=0,s[1]=1;
for(int i=10;i;i--)if(n/(1<<i)){T=i;break;}
for(;;T++)if(dfs(1)){printf("%d\n",T);break;}
}
}

POJ 3134 Power Calculus ID-DFS +剪枝的更多相关文章

  1. poj 3134 Power Calculus(迭代加深dfs+强剪枝)

    Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...

  2. POJ 3134 Power Calculus (迭代剪枝搜索)

    题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...

  3. 迭代加深搜索POJ 3134 Power Calculus

    题意:输入正整数n(1<=n<=1000),问最少需要几次乘除法可以从x得到x的n次方,计算过程中x的指数要求是正的. 题解:这道题,他的结果是由1经过n次加减得到的,所以最先想到的就是暴 ...

  4. poj 3134 Power Calculus(IDA*)

    题目大意: 用最小的步数算出  x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A*   就是如果这个数一直平方  所需要的步骤数都不能达到最优   就剪掉 #include < ...

  5. POJ 3134 - Power Calculus (IDDFS)

    题意:求仅仅用乘法和除法最快多少步能够求到x^n 思路:迭代加深搜索 //Accepted 164K 1094MS C++ 840B include<cstdio> #include< ...

  6. POJ 3134 - Power Calculus

    迭代加深 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<al ...

  7. 【POJ】3134 Power Calculus

    1. 题目描述给定一个正整数$n$,求经过多少次乘法或除法运算可以从$x$得到$x^n$?中间结果也是可以复用的. 2. 基本思路实际结果其实非常小,肯定不会超过20.因此,可以采用IDA*算法.注意 ...

  8. 【POJ - 1190】生日蛋糕 (dfs+剪枝)

    Descriptions: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为 ...

  9. POJ 1564 Sum It Up (DFS+剪枝)

                                                                                                       ...

随机推荐

  1. Eric6中编译窗体时,弹出提示:无法启动pyuic5的解决方案

    用 Eric6 与 PyQt5 结合,非常方便的实现界面与逻辑分离,满足python的极速GUI编程,不需要在界面上花很多时间. 这是一对GUI开发完美的组合! Eric6中设计窗体时,弹出提示:‘无 ...

  2. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  3. Activity创建时布局文件的实现原理

    setContenView(R.id.activity)实现原理 1.底层框架根据布局ID找到布局文件. 2.底层框架解析此布局文件(pull解析). 3.底层框架通过反射构建布局文件中的元素对象(E ...

  4. 三.Windows I/O模型之事件选择(WSAEventSelect )模型

    1.事件选择模型:和异步选择模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知.对于异步选择模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型.事件选择模型和 ...

  5. Angular 通过constant(name,value),value(name,value)创建服务

    区别: constant()可以将已经存在的变量值注册为服务,并将其注入到应用的其他部分中,他的value可以是值,也可以是对象.通过他来配置数据,也就是说可以在config里注入,但是他是不可以修改 ...

  6. Block Functionality

    Block Functionality A block is an anonymous inline collection of code that: Has a typed argument lis ...

  7. HDU1079-Calendar Game 简单思维博弈··

    题意:给你1990,1.1----2001.11.4范围内的某一天,格式year month day  两人轮流操作: 1. day+1; 2.month + 1: 谁先达到2001.11.4号,谁获 ...

  8. 【python正则】工作中常用的python正则代码

    工作中常用的一些正则代码: 01.用户名正则 import re # 4到16位(字母,数字,下划线,减号)if re.match(r'^[a-zA-Z0-9_-]{4,16}$', "ab ...

  9. 【codeforces 805B】3-palindrome

    [题目链接]:http://codeforces.com/contest/805/problem/B [题意] 让你生成一个只包含a,b,c的字符串; 要求c出现的次数最少,且任意一个 长度为3的子串 ...

  10. FactoryBean简介

    网上看了很多关于FactoryBean和BeanFactory的介绍,总感觉说的不够简单.直白,今天用自己的语言来描述下,如果有不对的地方,还请大家指正. 1. FactoryBean和BeanFac ...