poj 3134 Power Calculus (IDA*)
来源:互联网 发布:爱编程(北京)教育 编辑:程序博客网 时间:2024/05/22 15:16
Description
Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multiplications:
x2 = x × x, x3 = x2 × x, x4 = x3 × x, …, x31 = x30 × x.
The operation of squaring can be appreciably shorten the sequence of multiplications. The following is a way to compute x31 with eight multiplications:
x2 = x × x, x3 = x2 × x, x6 = x3 × x3, x7 = x6 × x, x14 = x7 × x7, x15 = x14 × x, x30 = x15 × x15, x31 = x30 × x.
This is not the shortest sequence of multiplications to compute x31. There are many ways with only seven multiplications. The following is one of them:
x2 = x × x, x4 = x2 × x2, x8 = x4 × x4, x8 = x4 × x4, x10 = x8 × x2, x20 = x10 × x10, x30 = x20 × x10, x31 = x30 × x.
If division is also available, we can find a even shorter sequence of operations. It is possible to compute x31 with six operations (five multiplications and one division):
x2 = x × x, x4 = x2 × x2, x8 = x4 × x4, x16 = x8 × x8, x32 = x16 × x16, x31 = x32 ÷ x.
This is one of the most efficient ways to compute x31 if a division is as fast as a multiplication.
Your mission is to write a program to find the least number of operations to compute xn by multiplication and division starting with x for the given positive integer n. Products and quotients appearing in the sequence should be x to a positive integer’s power. In others words, x−3, for example, should never appear.
Input
The input is a sequence of one or more lines each containing a single integer n. n is positive and less than or equal to 1000. The end of the input is indicated by a zero.
Output
Your program should print the least total number of multiplications and divisions required to compute xn starting with x for the integer n. The numbers should be written each in a separate line without any superfluous characters such as leading or trailing spaces.
Sample Input
13170914735128119530
Sample Output
06891191312
Source
题意:
通过乘法和除法将 X 变为 X^n ,找出最快需要几步,每一步相乘或相除的数都需要再次之前出现过。
思路:
IDA*,每次限制深度往下搜,A*剪枝为 设当前的数为x^a,那么这个数通过平方迭代增长最大次数都不能达到n的话就剪枝。增长过程为 x^a->x^2a->x^4a->x^8a...
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define maxn 2005#define MAXN 100005#define mod 1000000007#define INF 0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-6typedef long long ll;using namespace std;int n,m,ans,k,flag,cnt,deep;int vis[maxn];void dfs(int pos){ int i,j,t; if(flag||pos>deep||(vis[pos]<<(deep-pos))<n) return ; // 通过自身相乘(即指数相加 最快方式)都不能达到n 剪枝 if(vis[pos]==n) { flag=1; return ; } for(i=1;i<=pos;i++) { if(flag) return ; t=vis[pos]+vis[i]; if(t>0&&t<2000) { vis[pos+1]=t; dfs(pos+1); } t=vis[pos]-vis[i]; if(t>0&&t<2000) { vis[pos+1]=t; dfs(pos+1); } }}int main(){ int i,j; while(scanf("%d",&n),n) { deep=flag=0; // deep-多少个数相乘 vis[1]=1; while(!flag) // 迭代加深 { deep++; dfs(1); } printf("%d\n",deep-1); } return 0;}
- poj 3134 Power Calculus (IDA*)
- poj 3134 Power Calculus(IDA*)
- poj 3134 Power Calculus (IDA*)
- POJ 3134Power Calculus(IDA*)
- POJ 3134 Power Calculus (IDA*)
- POJ 3134 - Power Calculus
- Power Calculus(POJ 3134)
- UVa 1374 - Power Calculus(IDA*)
- UVa 1374:Power Calculus(IDA*)
- poj3134 Power Calculus IDA*
- poj 3134Power Calculus (IDAstar)
- POJ 3134 - Power Calculus (IDDFS)
- POJ 3134 Power Calculus 笔记
- UVA 1374 Power Calculus(IDA*)
- 【IDA*】POJ3134[Power Calculus]题解
- UVA 1374 ——Power Calculus(IDA*搜索)
- poj 3134 Power Calculus iddfs(迭代深搜)
- UVa 1374 - Power Calculus <IDA*算法>
- hive参数说明
- redis配置文件redis.conf的详细说明
- 体会函数参数传递(1)
- 插入排序
- 定位Oops的具体代码行
- poj 3134 Power Calculus (IDA*)
- 计算机科学期刊介绍--各种杂志投稿方式与评价
- 24 java 常用的方法
- 快速排序
- 开发过程中如何提高用户体验(1)
- 数据结构、算法与应用--类
- Git 和 GitHub学习更多资料
- OSB 自定义XPath Function
- toad 显示某一用户下的所有表结构信息