算法复习总结

本文详细介绍了搜索问题中的深度优先和广度优先搜索,特别是迭代加深搜索和双向广度优先搜索。接着深入探讨了动态规划的各种应用场景,包括一维和二维问题的递推解法。此外,还讲解了分治策略中的快速排序,贪心算法的第K大数问题,以及矩阵快速幂等高效计算方法。文章最后提到了随机算法中的拉斯维加斯算法和蒙特卡洛算法在解决最小割问题上的应用。
摘要由CSDN通过智能技术生成

目录

搜索问题 

深度优先搜索

迭代加深搜索

广度优先搜索

双向广度优先搜索

 动态规划

一维递推问题(求和形式)

爬楼梯

 一维递推问题(最值形式)

 数字三角形

最长上升子序列

 二维问题(区间问题)

最长回文子序列

 最优矩阵链乘法

区间最值查询

二维问题(序列间比较问题)

分治

快速排序

贪心

第K大数

矩阵快速幂

计算斐波那契数列第 n 项

 等你下课

 等比数列和​

开关灯

 233矩阵

 字符串相连

 二分查找

上下界

砍木头​

随机算法 

拉斯维加斯算法

快速排序

蒙特卡洛算法

最小割


搜索问题 

深度优先搜索

翻转开关问题

迭代加深搜索

埃及分数问题

广度优先搜索

双向广度优先搜索

 

八数码问题

八数码问题(三种解决办法) - 编程猎人

#include <iostream>
#include <string>
#include <queue>
#include <map>

using namespace std;

//记录该string状态处于正(反)向的第几层BFS
map<string, int>fsign, rsign;
int fcnt[300000];
int rcnt[300000];

string aim = "123804765";

//1:up,2:down,3:left,4:right
int moveto(int i, int index) {
    switch (i) {
    case 1:
        if (index - 3 >= 0)return index - 3;
        break;
    case 2:
        if (index + 3 <= 8)return index + 3;
        break;
    case 3:
        if (index % 3 != 0)return index - 1;
        break;
    case 4:
        if (index % 3 != 2)return index + 1;
        break;
    }
    return -1;
}

bool extend(queue<string>&q, int head, int &tail, int direction) {
    string now = q.front(); q.pop();
    int from = now.find('0');
    for (int i = 1; i <= 4; i++) {
        int to = moveto(i, from);
        if (to != -1) {
            swap(now[from], now[to]);
            if (direction == 1) {  //up to dowm
                if (!fsign[now]) {  // not visited yet
                    q.push(now);
                    fsign[now] = fcnt[tail++] = fcnt[head] + 1;
                    if (rsign[now]) {
                        cout << fcnt[tail - 1] + rsign[now] << endl;
                        return true;
                    }
                }
            }
            else {// down to up
                if (!rsign[now]) {
                    q.push(now);
                    rsign[now] = rcnt[tail++] = rcnt[head] + 1;
                    if (fsign[now]) {
                        cout << rcnt[tail - 1] + fsign[now] << endl;
                        return true;
                    }

                }
            }
            swap(now[from], now[to]);
        }
    }
    return false;
}

void DBFS(string start) {
    if (start.compare(aim) == 0) {
        cout << '0' << endl;
        return;
    }
    bool flag = false;
    queue<string>forward, reverse;
    forward.push(start);
    reverse.push(aim);
    string forwardNow = start, reverseNow = aim;
    fsign[start] = 0; rsign[aim] = 0;
    int head = 0, tail = 1, rhead = 0, rtail = 1;
    while (!flag) {
        if (forward.size() <= reverse.size()) {  // choose the shorter one
            if (extend(forward, head, tail, 1))return;
            head++;
        }
        else {
            if (extend(reverse, rhead, rtail, 2))return;
            rhead++;
        }
    }
}

int main() {
    string start;
    cin >> start;

    DBFS(start);

    return 0;
}

 动态规划

一维递推问题(求和形式)

爬楼梯

 一维递推问题(最值形式)

 数字三角形

动态规划详解(数字三角形POJ1163)_ancientear的博客-CSDN博客_数字三角形动态规划

最长上升子序列

 二维问题(区间问题)

最长回文子序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值