记忆化搜索

简介: 复习acwing算法基础课的内容,本篇为讲解基础算法:动态规划——记忆化搜索,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、动态规划

二、AcWing 901. 滑雪

本题解析

AC代码

三、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:动态规划——记忆化搜索,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、动态规划

动态规划(Dynamic Programming,DP)是求解决策过程最优化的过程,个人认为是目前接触的所有算法里最绕的…


这里的题目的解题方法来自于:y总的闫氏dp分析法


二、AcWing 901. 滑雪

本题链接:AcWing 901. 滑雪

本博客提供本题截图:

image.png

image.png

本题解析

image.png

这里的代码很像 BFS 那边的内容,事实上记忆化搜索(DP)确实是 DFS之剪枝与优化的一种方式

AC代码

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 310;
int n, m;
int g[N][N];
int f[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dp(int x, int y)
{
    int &v = f[x][y];
    if (v != -1) return v;
    v = 1;
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a >= 1 && a <= n && b >= 1 && b <= m && g[x][y] > g[a][b])
            v = max(v, dp(a, b) + 1);
    }
    return v;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            scanf("%d", &g[i][j]);
    memset(f, -1, sizeof f);
    int res = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            res = max(res, dp(i, j));
    printf("%d\n", res);
    return 0;
}

三、时间复杂度

关于动态规划——记忆化搜索的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
6月前
|
消息中间件 Kubernetes NoSQL
动态规划-状态压缩、树形DP问题总结
动态规划-状态压缩、树形DP问题总结
|
算法
【学会动态规划】最大子数组和(19)
【学会动态规划】最大子数组和(19)
47 0
|
算法
【算法专题突破】双指针 - 三数之和(7)
【算法专题突破】双指针 - 三数之和(7)
48 0
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
6月前
|
算法 大数据
二分查找和二分答案
二分查找和二分答案
57 1
|
6月前
|
算法 索引
二分查找与二分答案
二分查找与二分答案
|
6月前
|
算法 NoSQL 容器
二分查找 三分查找与二分答案
二分查找 三分查找与二分答案
|
人工智能 算法 搜索推荐
LeetCode 周赛 338,贪心 / 埃氏筛 / 欧氏线性筛 / 前缀和 / 二分查找 / 拓扑排序
大家好,我是小彭。 上周末是 LeetCode 第 338 场周赛,你参加了吗?这场周赛覆盖的知识点很多,第四题称得上是近期几场周赛的天花板。
111 0
|
算法 C++
记忆化搜索算法的实现
记忆化搜索算法的实现
记忆化搜索算法的实现
|
算法 测试技术
贪心——53. 最大子数组和
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
贪心——53. 最大子数组和