题意:给你个数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. mybatis 高级映射和spring整合之逆向工程(7)

    mybatis 高级映射和spring整合之逆向工程(7) 4.0 逆向工程 4.1 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行 ...

  2. CUDA与OpenCL架构

    CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 GPU简介 1.2 GPU与CPU的差异 2 CUDA架构 2.1 硬件架构 2.1.1 GPU困境 ...

  3. class A<T> where T:new()相关知识点

    来源:http://www.cnblogs.com/FredWang/p/4284251.html class A<T> where T:new()  ===>>>   ...

  4. SQL 字段类型详解

    bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off.    注意:很省空间的一种数据 ...

  5. 【技术累积】【点】【java】【6】时间戳

    闲聊 加班多诶,写博客诶. 基本 时间戳,直观理解就是时间上面盖个戳罢了,在时间这个轴上面记录个点: unix时间戳表示从开始的时间点开始,经过了多少秒: 可以简单的看做是一个计时器: 基本定义可以直 ...

  6. RabbitMQ学习之集群镜像模式配置

    1.增加负载均衡器 关于负载均衡器,商业的比如F5的BIG-IP,Radware的AppDirector,是硬件架构的产品,可以实现很高的处理能力.但这些产品昂贵的价格会让人止步,所以我们还有软件负载 ...

  7. CorelDRAW X7中相机滤镜呈现出的复古照片效果

    CorelDRAW X7软件中相机效果滤镜较之以前版本又增添了许多功能,模拟各种“相机”镜头产生的效果,包括彩色.相片过滤器.棕褐色色调和时间器效果,可以让照片回到历史,展示过去流行的摄影风格.以下步 ...

  8. day27-3 matplatlib模块

    目录 matplotlib 条形图 折线图 散点图 matplotlib 图形可视化,主要用来画图 别问,问就是看不懂 条形图 import matplotlib.pyplot as plt # 只识 ...

  9. ios高效开发二--ARC跟block那点事

    block是可以捕捉上下文的特殊代码块. block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本. 如果通过self拥有一个block,然后 ...

  10. JAVA中各个包的主要作用

    00:48:0800:48:1022013013-06-282013-06-2800:48:182013-06-2800:48:20  java.util是JAVA的utility工具包 java.l ...