本文主要是介绍迭代加深搜索——POJ 3134,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Power Calculus
Description
Starting with x and repeatedly multiplying by x, we can computex31 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 computex31 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 computex31 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 computexn by multiplication and division starting withx for the given positive integern. Products and quotients appearing in the sequence should bex 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 computexn starting withx 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
1 31 70 91 473 512 811 953 0
Sample Output
0 6 8 9 11 9 13 12
不断加大搜索的深度 每层搜索就用前一步得出的值和之前产生的所有值进行乘或除运算得出新的值剪枝 : 假设当前已经算出来的x的幂的次方数最大是 n_max 那么如果还可以深入搜索 3 层的话 x 的次方数最多只可能变成 n_max << 3所以如果 n_max << (还剩下的搜索层数) < n 的话已经没有继续搜索的必要 回退
#include<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<iostream> const int MAXN=1000+10; const int INF=1<<30; using namespace std; int n,ans=INF; int a[MAXN]; int maxh;bool dfs(int x, int cur) {if((x*(1<<(maxh-cur)))<n) return false;if(cur>maxh) return false;a[cur]=x;if(x==n){return true;}int t=cur;for(int i=0; i<=t; i++){if(dfs(x+a[i], cur+1)) return true;if(x-a[i]>0){ if(dfs(x-a[i],cur+1)) return true;}else if(dfs(a[i]-x,cur+1)) return true;}return false; }int main() {//freopen("in.txt","r",stdin);while(scanf("%d", &n), n){maxh=0;memset(a,0,sizeof(a));while(dfs(1,0)==false){ans=INF;memset(a,0,sizeof(a));maxh++;}printf("%d\n", maxh);}return 0; }
这篇关于迭代加深搜索——POJ 3134的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!