题意:给你个数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. 3D特征:关于HFM和HBB

    1.HBB    三维绑定框 (1): 要用到HBB,定义还不太清楚,来自于 VALVE Developer Community (https://developer.valvesoftware.co ...

  2. php常用方法一

    1.用户名用***替换 /** * 用户名中间用***替换 * @param string $str 需要替换的字符串 * @param int $len 需要替换的位数 * @param strin ...

  3. load 调用的顺序

    主要是依赖关系. 调用的顺序 你过去可能会听说过,对于 load 方法的调用顺序有两条规则: 父类先于子类调用 类先于分类调用 这种现象是非常符合我们的直觉的,我们来分析一下这种现象出现的原因. 第一 ...

  4. javaEE_maven_struts2_tomcat_first

    1 .eclipse中新建项目

  5. Java中 ArrayList类的使用

    java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素.此类提供一些方法来操作内部存储 的元素. ArrayList 中可不断添加元素,其大小也自动增长. ArrayL ...

  6. springboot版本控制

    HandlerMapping通过继承InitializingBean接口在完成实例后,扫描所有的Controller和标识RequestMapping的方法,缓存这个映射对应关系.然后在应用运行的时候 ...

  7. Nginx+Php-fpm运行原理

    一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com. vpn对于“我们”来说,是可以感知到的(我 ...

  8. nginx的缓存设置提高性能

    对于网站的图片,尤其是新闻站, 图片一旦发布, 改动的可能是非常小的.我们希望 能否在用户访问一次后, 图片缓存在用户的浏览器端,且时间比较长的缓存. 可以, 用到 nginx的expires设置 . ...

  9. Zookeeper 使用

    转自:https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ 安装和配置详解 本文介绍的 Zookeeper 是以 3.2. ...

  10. Ubuntu14.04 Anaconda

    我虚拟机Ubuntu14.04上的Python已经存在了两个版本,一个是python 2.7,一个是Python 3.4.想在它上面安装Anaconda,但又有所顾虑.我先想到的是,先卸载Ubuntu ...