IDA*算法在ACM竞赛中运用的不多,但它功能强大、应用灵活,若运用得当,将会使得一些搜索题大大简化。
适用范围及基本原理:问题对应的解答树没有明显的深度限制,甚至每一层的宽度都是无限的,无法利用BFS或者DFS求解,此时可以用迭代加深搜索,从小到大枚举深度上限maxd进行搜索。而IDA*则是在其基础上加入启发函数g(n),g(n)代表从当前节点n至少还需要扩展多少层才有可能找到解,若当前n的深度为h(n),则可以利用maxd的深度限制进行解答树子树的剪枝,即当节点n满足h(n)+g(n)>maxd时,停止扩展以节点n为根的解答子树。因为在每一层都进行这样的估计预测,所以最终解的深度一定小于等于maxd。而maxd又是从小到大以此枚举的,所以最先找到的解一定是深度最小的解。
一般g(n)函数的选取依照最乐观的估计,如果最乐观的情况下深度都要超过maxd,则无论如何也要剪枝了。
一言以蔽之,IDA*是有深度下限限制的启发式的DFS。
经典题目:
1.埃及分数
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
int a,b,maxd;
typedef long long LL;
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
i