迭代加深(DFS)

简介: 复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、迭代加深

二、AcWing 170. 加成序列

本题解析

AC代码

三、时间复杂度


前言

复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、迭代加深

dfs中的迭代加深和bfs十分的类似,定一个搜索上界,然后利用剪枝去进行优化,进而实现迭代加深


二、AcWing 170. 加成序列

本题链接:AcWing 170. 加成序列

本博客提供本题截图:

image.png

image.png


本题解析

令一开始的搜索层数为1,如果没有搜到结果的话,我们就让层数++,对应到代码部分为:

int depth = 1;
while (!dfs(1, depth)) depth ++;

剪枝部分:我们按照数值最大的部分进行计算,因为这样可以少很多的枝叶,对于冗余部分,用一个st判重数组即可,数组p存的就是答案

AC代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int p[N] = {1};
int n;
bool st[N];
bool dfs(int u, int depth)
{
    if (u > depth) return false;
    if (p[u - 1] == n) return true;
    memset(st, false, sizeof st);
    for (int i = u - 1; i >= 0; i -- )
        for (int j = i; j >= 0; j -- )
        {
            int s = p[i] + p[j];
            if (s > n || s <= p[u - 1] || st[s]) continue;
            st[s] = true;
            p[u] = s;
            if (dfs(u + 1, depth)) return true;
        }
    return false;
}
int main()
{
    while (cin >> n, n)
    {
        int depth = 1;
        while (!dfs(1, depth)) depth ++;
        for (int i = 0; i < depth; i ++ ) 
            cout << p[i] << ' ';
        cout << endl;
    }
    return 0;
}

三、时间复杂度

关于迭代加深的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。

目录
相关文章
|
3月前
|
算法
DFS算法的实现
DFS算法的实现
62 3
|
5月前
|
C++
|
5月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
5月前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
机器学习/深度学习 人工智能 定位技术
|
算法
DFS and BFS
DFS and BFS
49 0
|
定位技术
DFS:踏青
DFS:踏青
|
算法
【和zqy学算法】Day1:DFS与BFS
【和zqy学算法】Day1:DFS与BFS
152 0