poj3134Power Calculus(IDA*)
来源:互联网 发布:如何查询软件著作权 编辑:程序博客网 时间:2024/06/03 18:36
题目请戳这里
题目大意:现在只有一个x,求最少经过多少步,可以得到x^n,每一步可以对已存在的x^k做乘法或除法运算.
题目分析:n范围不大,不超过1000.所以可以断定任何一组数据20步之内一定出解!但是此题数字的组合方案很多,所以整颗搜索树会很宽,再加上要判重,bfs的话空间消耗非常大.故采用dfs解决.又由于要求最优解,所以迭代加深.代码还是比较好写的,但是会发现写出来后样例都跑不出来.所以需要剪枝.我想了2个剪枝:
1.首先确定迭代加深的上界:将n二进制展开,求出n的二进制位数,设为len,显然至少len步才能出解,所以设len为迭代初始值.
2.启发式函数:可以感受到,要想将当前的x的幂迅速靠近n,最快的方法是不断累加,即幂不断乘2.如果当前幂在最快的速度增长的情况下还是不能在规定步数到达目标,剪之.
加了这2个剪枝后效果挺好的,直接从几十秒跑到1秒多.
详情请见代码:
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1005;const int M = 1000005;int n,ans;bool ok,flag[N + N];int stk[N + N];int A(int cur,int dp){ int ret = 0; while(cur < n) { cur <<= 1; ret ++; } return ret;}void dfs(int cur,int dp){ if(!ok) return; if(dp + A(cur,dp) > ans) return; if(cur == n) { ok = false; return; } stk[dp] = cur; for(int i = 0;i <= dp;i ++) { int tmp = cur + stk[i]; if(tmp >= 1 && tmp <= (n<<1) && !flag[tmp]) { flag[tmp] = true; dfs(tmp,dp + 1); flag[tmp] = false; } if(!ok) return; tmp = cur - stk[i]; if(tmp >= 1 && tmp <= (n<<1) && !flag[tmp]) { flag[tmp] = true; dfs(tmp,dp + 1); flag[tmp] = false; } if(!ok) return; }}void fuck(){ ans = 0; ok = true; memset(flag,false,sizeof(flag)); int tmp = n; while(tmp) { ans ++; tmp /= 2; } ans --; flag[1] = true; while(ok) { dfs(1,0); if(!ok) break; ans ++; } printf("%d\n",ans);}int main(){ while(scanf("%d",&n),n) { fuck(); } return 0;}
0 0
- poj3134Power Calculus(IDA*)
- poj3134 Power Calculus IDA*
- poj 3134 Power Calculus(IDA*)
- poj 3134 Power Calculus (IDA*)
- POJ 3134Power Calculus(IDA*)
- POJ 3134 Power Calculus (IDA*)
- UVA 1374 Power Calculus(IDA*)
- 【IDA*】POJ3134[Power Calculus]题解
- poj 3134 Power Calculus (IDA*)
- UVa 1374 - Power Calculus <IDA*算法>
- UVa 1374 - Power Calculus(IDA*)
- UVa 1374:Power Calculus(IDA*)
- UVA - 1374 Power Calculus(IDA*+剪枝)
- UVA 1374 ——Power Calculus(IDA*搜索)
- Uva1374 Power Calculus(快速幂计算)【IDA*】【例题7-13】
- IDA
- ida
- IDA*
- Codeforces Round #220 (Div. 2) A题
- 如何才能使用apt-get使用本地安装源进行安装
- Shell编程基础
- effective c++ note1
- 神经网络设计_学习规则总结
- poj3134Power Calculus(IDA*)
- 字符编码笔记:ASCII,Unicode和UTF-8
- 百钱买百鸡
- IntelliJ IDEA java工程如何添加jar
- ibatis的insert问题
- 前景检测算法_1(codebook和平均背景法)
- Oracle Package 实例
- 黑马程序员_Java多线程
- 使用java.util.Calendar来取得相关日期信息