每天学一丢意为每天学一点丢一点。
然后每天二字名存实亡,还是坚持在每天学习,只是每天学习的东西不够单开一文去总结。
这段时间在准备各种比赛,所以题解没有跟上,还不好说会不会补训练赛的题解。
IDDFS(iterative deepening deep-first-search)迭代 加深 搜索
首先第一点我们知道,在迷宫问题计算最短路的时候,我们经常使用BFS 这样做的好处是:第一次搜索到目标点时,就是到达目标点的最小步数。因为我们每次都存下了当前步能达到的所有点。而BFS所使用的空间开支较大,我们每一步都存下了当前步所能达到的所有点的坐标。而DFS的话,我们的空间开支较小,走了多少步就需要多少空间,但是因为没有一个明确的结束标准,所以我们不知道DFS要到什么时候停下来,所以也有可能会产生较大的时间开支。
这个时候,我们就学习到了一种新的搜索方法:迭代加深搜索。IDDFS的特点是:用BFS的思想去跑DFS。
我们知道DFS的搜索我们都有一个深度,那么我们限制每次搜索的深度,就像是用DFS每次去跑出BFS的某一层。
这个时候的好处是:我们的空间开销减少了,但是由于我们没加深一层,都相当于对其N-1层又跑了一遍DFS,而这个虽然是重复计算越多的内容越少(深度较小时节点数目较少)但累加起来也是不小的开销。所以相当于我们用时间去换取了部分空间。
所以IDDFS一般用于:空间限制较强,或BFS需要较大空间,而时间相对宽松的情况,给出一道例题和AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
using namespace std;
#define pb push_back
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", n);
#define pdd(n,m) printf("%d %d\n", n, m);
#define pld(n) printf("%lld\n", n);
#define pldd(n,m) printf("%lld %lld\n", n, m);
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define ansn() printf("%d\n",ans)
#define lansn() printf("%lld\n",ans)
#define r0(i,n) for(int i=0;i<(n);++i)
#define r1(i,e) for(int i=1;i<=e;++i)
#define rn(i,e) for(int i=e;i>=1;--i)
typedef long long LL;
typedef unsigned long long ull;
typedef long double ld;
const LL mod = 1000000007;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const int maxn = 1e3+5;
int n, maxh;
int a[maxn];
bool dfs(int deep, int now)
{
a[deep] = now;
if(deep > maxh) return false;
if(now == n) {
// cout<<deep<<endl;
// r0(i, deep+1)
// printf("%d%c", a[i], i==n?'\n':' ');
return true;
}
else if(now<<(maxh-deep) < n) return false+;
for(int i=0; i<=deep; i++)
{
if(dfs(deep+1, now+a[i])) return true;
else if(dfs(deep+1, abs(now-a[i]))) return true;
}
return false;
}
int main()
{
while(sd(n) && n!=0)
{
r0(i, n+1){
maxh = i;
if(dfs(0, 1)) break;
}
pd(maxh);
}
}