POJ 3134 Power Calculus ID-DFS +剪枝
题意:给你个数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 +剪枝的更多相关文章
- poj 3134 Power Calculus(迭代加深dfs+强剪枝)
Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...
- POJ 3134 Power Calculus (迭代剪枝搜索)
题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...
- 迭代加深搜索POJ 3134 Power Calculus
题意:输入正整数n(1<=n<=1000),问最少需要几次乘除法可以从x得到x的n次方,计算过程中x的指数要求是正的. 题解:这道题,他的结果是由1经过n次加减得到的,所以最先想到的就是暴 ...
- poj 3134 Power Calculus(IDA*)
题目大意: 用最小的步数算出 x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A* 就是如果这个数一直平方 所需要的步骤数都不能达到最优 就剪掉 #include < ...
- POJ 3134 - Power Calculus (IDDFS)
题意:求仅仅用乘法和除法最快多少步能够求到x^n 思路:迭代加深搜索 //Accepted 164K 1094MS C++ 840B include<cstdio> #include< ...
- POJ 3134 - Power Calculus
迭代加深 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<al ...
- 【POJ】3134 Power Calculus
1. 题目描述给定一个正整数$n$,求经过多少次乘法或除法运算可以从$x$得到$x^n$?中间结果也是可以复用的. 2. 基本思路实际结果其实非常小,肯定不会超过20.因此,可以采用IDA*算法.注意 ...
- 【POJ - 1190】生日蛋糕 (dfs+剪枝)
Descriptions: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为 ...
- POJ 1564 Sum It Up (DFS+剪枝)
...
随机推荐
- 【Oracle】手工建库启动到nomount状态时错误ORA-09925,ORA-01017
配置好pfile和口令文件后启动数据库到nomount状态下出现错误: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2 ...
- django 安装运行
pip install django pip list 查看版本 python -m django --version 新建django django-admin startproject mysit ...
- oracle 表锁定解锁
Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count( ...
- ESLint 规范项目代码
ESLint 由 JavaScript 红宝书 作者 Nicholas C. Zakas 编写, 2013 年发布第一个版本. NCZ 以可扩展.每条规则独立.不内置编码风格为理念编写了一个 lint ...
- Windows负载机JVM 远程监控Linux服务器下tomcat
基本是跟着网上的操作进行的,除了遇到一个Local host name unknown的问题: 一.Linux服务器操作部分 服务器地址:10.64.111.68 首先配置JMX: 1.找到jdk目录 ...
- Lazy Stored Properties--无括号时为匿名函数
第一次使用的时候进行计算和初始化,后面的引用不在进行计算. A lazy stored property is a property whose initial value is not calcul ...
- vue常用方法
vue移动端ui库: http://mint-ui.github.io/#!/zh-cn vue做app开发使用: weex 官网地址:http://weex.apache.org/cn 1.Vue组 ...
- 如何使用Matlab做数字信号处理的仿真1
例如 第三版数字信号处理P51 -1.14习题时域离散信号的相关性研究x(n)=Asin(ωn)+u(n),其中ω=π/16,u(n)是白噪声,现要求 ⑴.产生均值为0,功率P=0.1的均匀分布白噪声 ...
- python笔记4----字典
1.哈希: 输入任意长度,输出固定长度. 即判断是否哈希,即判断可不可变. 2.创建字典 (1)直接创建:dic={1:'a',2:'b',3:'c'} (2)dict函数创建: list=[(1,' ...
- IOS开发:官方自带的JSON使用
apple在ios5的时候提供了json的相关处理api,其中最主要的是NSJSONSerialization类. + (BOOL)isValidJSONObject:(id)obj; + (NSDa ...