Power Calculus POJ - 3134 (IDDFS)

https://vjudge.net/problem/POJ-3134

题意:快速计算x^n,例如x^31,x2 = x × xx4 = x2 × x2, x8 = x4 × x4, x16 = x8 × x8, x32 = x16 × x16, x31 = x32 ÷ x.

至少需要6次乘法,现在输入n,求至少需要多少次乘法。

 

先说一下什么是IDDFS

迭代深化搜索(iterative deepening search)或者更确切地说迭代深化深度优先搜索 (iterative deepening depth-first search (IDS or IDDFS)) 是一个状态空间(状态图)搜索策略。

简单来说就是以BFS的思想来写DFS, 首先深度优先搜索k层,若没有找到可行解,再深度优先搜索k+1层,直到找到可行解为止。由于深度是从小到大逐渐增大的,所以当搜索到结果时可以保证搜索深度是最小的。这也是迭代加深搜索在一部分情况下可以代替广度优先搜索的原(还比广搜省空间)

前提:

先预估一个深度(尽量小)进行搜索,再预估一个最大的深度作为上限, 防止死循环, 即乐观估计剪枝

最大深度限制逐步递增, 直到碰到乐观估计值返回

适用条件:

 需要做广度优先搜索,但却没有足够的空间,而时间却很充裕,碰到这类问题,我们可以选择迭代加深搜索算法。适用于当搜索深度没有明确上限的情况。

相比广搜和深搜的优点

1.不像广搜会跑完整张图, 节省了空间复杂度. 对于K+1层搜索时搜索前k层的浪费, 相比于于一个复杂度来说, 其实算不了什么.

2.时间复杂度只比BFS稍差一点(虽然搜索k+1层时会重复搜索k层,但是整体而言并不比广搜慢很多)。

3.空间复杂度与深搜相同,却比广搜小很多。

4.利于剪枝。

 

再说这道题目, 一道基础的IDDFS题目. 因为是幂数想成, 可以直接简化为加减法, 而且一定是从1开始, 我们控制着深度(也就是至少要几步能够得到该解)从0开始逐步增大maxh, 因为题目保证有解, 所以不会出现死循环

第十行我解释一下, 2^(maxh-curh)表示就算把当前深度只用来一直相乘也达不到n的剪枝, 可以直接跳出

//Power Calculus
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 1010;
int num[maxn], n, maxh; //maxh为最大深度
bool Dfs(int curn, int curh)
{ //深搜状态为(当前数, 当前深度), 有解则返回true
    if(curn<<(maxh-curh) < n) return 0; //乐观估计剪枝,当前深度到限制深度指数最多增长2^(maxh-curh)倍
    if(curh > maxh) return 0;//到达限制深度
    num[curh] = curn;
    if(curn == n) return 1; //到达终点
    for(int i = 0; i <= curh; i++){
        if(Dfs(curn+num[i], curh+1)) return 1; //幂的乘法
        if(Dfs(curn>num[i]?curn-num[i]:num[i]-curn, curh+1)) return 1; //幂的除法
    }
    return 0;
}
int main()
{
    while(scanf("%d",&n) && n){
        maxh = 0, memset(num, 0, sizeof(num)); //初始化
        while(!Dfs(1, 0)){
            memset(num, 0, sizeof(num));
            maxh++;
        }
        printf("%d\n",maxh); //理论上一定有答案
    }
    return 0;
}

参考博客: https://www.cnblogs.com/blogo-de-vk/p/7452473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值