[Algorithm][动态规划][路径问题][下降路径最小和][最小路径和][地下城游戏]详细讲解

news2024/12/22 14:35:43

目录

  • 1.下降路径最小和
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.最小路径和
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.地下城游戏
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.下降路径最小和

1.题目链接

  • 下降路径最小和

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • 到达[i, j]位置时,最小的下降路径
        请添加图片描述
    • 推导状态转移方程

      • dp[i][j] = min(x, y, z) + m[i][j]
        请添加图片描述
    • 初始化:vector<vector<int>> dp(n + 1, vector<int>(m + 2, INT_MAX))

      • dp[0, i] = 0 -> 第一行初始化为0
        请添加图片描述
    • 确定填表顺序:从上往下

    • 确定返回值:最后一行的最小值


3.代码实现

int minFallingPathSum(vector<vector<int>>& matrix) 
{
    // Init
    int n = matrix.size();
    vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));
    for(int i = 0; i < n + 2; i++)
    {
        dp[0][i] = 0;
    }

    // Dynamic Plan
    for(int i = 1; i < n + 1; i++)
    {
        for(int j = 1; j < n + 1; j++)
        {
            dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j + 1]))
                + matrix[i - 1][j - 1]; 
        }
    }

    // 找最小值
    int ret = INT_MAX;
    for(int i = 0; i < n + 2; i++)
    {
        ret = min(ret, dp[n][i]);
    }

    return ret;
}

2.最小路径和

1.题目链接

  • 最小路径和

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • 走到dp[i][j]的时候,最小路径和
        请添加图片描述
    • 推导状态转移方程

      • dp[i][j] = min(dp[i - 1][j] + dp[i][j - 1]) + g[i - 1][j - 1]
    • 初始化:dp表多开一行和一列虚拟结点,避免处理边界

      • dp[0][1] = dp[1][0] = 0
        请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][m]


3.代码实现

int minPathSum(vector<vector<int>>& grid) 
{
    // Init
    int n = grid.size(), m = grid[0].size();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, INT_MAX));
    dp[0][1] = dp[1][0] = 0;

    // Dynamic Plan
    for(int i = 1; i < n + 1; i++)
    {
        for(int j = 1; j < m + 1; j++)
        {
            dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
        }
    }

    return dp[n][m];
}

3.地下城游戏

1.题目链接

  • 地下城游戏

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • [i, j]出发,到达终点,所需的最低初始健康点数
        请添加图片描述
    • 推导状态转移方程

      • dp[i][j] = min(dp[i][j + 1] + dp[i + 1][j]) - d[i][j]
      • dp[i][j] = max(1, dp[i][j]
        • 避免出现负血量也可以来到此位置
          请添加图片描述
    • 初始化:vector<vector<int>> dp(n + 1, vector<int>(m + 1, INT_MAX))

      • dp[n][m - 1] = dp[n - 1][m] = 1
        请添加图片描述
    • 确定填表顺序:从下往上,从右往左

    • 确定返回值:dp[0][0]

  • 本题为什么不可以到[i, j]…?
    • 因为本题中,[i, j]的值不仅受前面两个值影响,也受后面两个值影响
    • 如果从前面,可能确实从前面可以到[i, j],但是从[i, j]到后面就无法进行下去了

3.代码实现

int calculateMinimumHP(vector<vector<int>>& d) 
{
    // Init
    int n = d.size(), m = d[0].size();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, INT_MAX));
    dp[n][m - 1] = dp[n - 1][m] = 1;

    // Dynamic Plan
    for(int i = n - 1; i >= 0; i--)
    {
        for(int j = m - 1; j >= 0; j--)
        {
            dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - d[i][j];
            dp[i][j] = max(1, dp[i][j]); // 防止"死了还能到":P
        }
    }

    return dp[0][0];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1690490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp高校二手书交易商城回收系统 微信小程序python+java+node.js+php

每年因为有大量的学生在接受教育&#xff0c;每到大学毕业季的时候&#xff0c;所使用的大量书籍对他们自己来说&#xff0c;很多是没有用&#xff0c;同时由于书籍多和不方便携带&#xff0c;导致很多大学生在毕业时将教材直接丢弃是在校大学生处理已用教材的一种主要方式。然…

【调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站】

调试笔记-系列文章目录 调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站 文章目录 调试笔记-系列文章目录调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站 前言一、调试环境…

线性规划库PuLP使用教程

Python求解线性规划——PuLP使用教程 简洁是智慧的灵魂&#xff0c;冗长是肤浅的藻饰。——莎士比亚《哈姆雷特》 文章目录 一、说明二、安装 PuLP 库三、线性规划简介3.1 线性规划3.1.1 高考题目描述3.1.2 基本概念 3.2 整数规划3.2.1 题目描述[3]3.2.2 解题思路 四、求解过程…

c++ vector实现出现的一些问题

目录 前言&#xff1a; 浅拷贝问题: typename指定类型&#xff1a; 前言&#xff1a; 最近学习了c vector的使用&#xff0c;然后也自己实现了一下vector的部分重要的功能。然后在其中出现了一些问题&#xff0c;在这就主要记录一下我解决哪些bug。 浅拷贝问题: 在实现res…

8个实用网站和软件,收藏起来一定不后悔~

整理了8个日常生活中经常能用得到的网站和软件&#xff0c;收藏起来一定不会后悔~ 1.ZLibrary zh.zlibrary-be.se/这个网站收录了超千万的书籍和文章资源&#xff0c;国内外的各种电子书资源都可以在这里搜索&#xff0c;98%以上都可以在网站内找到&#xff0c;并且支持免费下…

Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略

Py之llama-parse&#xff1a;llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略 目录 llama-parse的简介 llama-parse的安装和使用方法 1、安装 2、使用方法 第一步&#xff0c;获取API 密钥 第二步&#xff0c;安装LlamaIndex、LlamaParse L…

React开发环境配置详细讲解-04

React环境 前端随着规范化&#xff0c;可以说规范和环境插件配置满天飞&#xff0c;笔者最早接触的是jquery&#xff0c;那个开发非常简单&#xff0c;只要引入jquery就可以了&#xff0c;当时还写了一套UI框架&#xff0c;至今在做小型项目中还在使用&#xff0c;show一张效果…

Java进阶学习笔记3——static修饰成员方法

成员方法的分类&#xff1a; 类方法&#xff1a;有static修饰的成员方法&#xff0c;属于类&#xff1a; 成员方法&#xff1a;无static修饰的成员方法&#xff0c;属于对象。 Student类&#xff1a; package cn.ensource.d2_staticmethod;public class Student {double scor…

2018浙江省大学生程序设计竞赛

2018浙江省大学生程序设计竞赛 saber保佑&#xff01; A - Peak 题意&#xff1a;给出一个整数序列&#xff0c;判断序列是否有且仅有一个峰值&#xff1b; 思路&#xff1a; 首先遍历寻找同时严格大于两边元素的值&#xff0c;若存在多个直接pass&#xff1b; 然后分别判…

【30天精通Prometheus:一站式监控实战指南】第7天:postgres_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

ZFNet论文详解

ZFNet CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的一些经典的…

系统架构师-考试-基础题-错题集锦2

108.总线-全双工、半双工&#xff1a; 109.软件配置管理-产品配置&#xff1a; 产品配置&#xff1a;指一个产品在其生命周期各个阶段所产生的各种形式和各种版本的文档、计算机程序、部件及数据的集合。 注意&#xff1a;选项中的需求规格说明、设计说明等均可归属于文档。 …

数组-求和为k的连续子数组

一、题目描述 二、题目思路 这里注意&#xff1a;题目要求时间、空间复杂度都为O(n)&#xff0c;所以不能直接通过双层循环来暴力解(时间复杂度为O&#xff08;n&#xff09;)&#xff0c;可以使用Map实现。 1. 遍历数组计算sum(i)&#xff0c;Map记录sum值第一次出现的位置&…

DPDK实践之(1)dpdk基础使用

DPDK实践之(1)dpdk基础使用 Author: Once Day Date: 2024年5月19日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;Linux基础知识_Once…

C++:关联容器及综合运用:

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。关联容器因此相比与顺序容器支持高效的关键字查找和访问。 其底层数据结构&#xff1a;顺序关联容器 ->红黑树&#xff0c;插入…

Matlab-遗传算法

文章目录 遗传算法一、介绍二、遗传算法的思想1.试用范围2.案例2.1 算法思路2.2 代码实现 遗传算法 一、介绍 遗传算法是一个启发式算法&#xff0c;主要可以用于优化问题&#xff0c;下边将进行举例来进行初步了解。 举例: 从做菜说起&#xff0c;首先你是一个大厨&#xff…

Ubuntu22.04本地部署qwen模型、jupyterlab开发环境、LoRA微调全流程

前言 这段时间在自己的Win11系统上部署了chatGLM以及Qwen模型&#xff0c;进行对话、推理以及工具调用都没有问题&#xff0c;但是在尝试进行微调的时候发现好像并不能成功&#xff0c;因此花费了很大的力气&#xff0c;又分别在ubuntu桌面版、windows子系统WSL2 Ubuntu上部署…

leetcode-55 跳跃游戏

leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人&#xff0c;从第一个下标开始&#xff0c;每次经过一个位置&#xff0c;我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…

Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation论文阅读

1. 代码地址 GitHub - cardwing/Codes-for-PVKD: Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation (CVPR 2022) 2. 动机 本篇文章旨在将点云语义分割的复杂模型中的知识蒸馏到较轻量级的模型中。具体的实现方式为将原有的3D backbone网络的每一层进…

恶劣天候激光雷达点云模拟方法论文整理

恶劣天候点云模拟方法论文整理 模拟雨天点云&#xff1a;【AAAI2024】模拟雪天点云&#xff1a;【CVPR 2022 oral】模拟雾天点云&#xff1a;【ICCV2021】模拟点云恶劣天候的散射现象&#xff1a;【Arxiv 2021】模拟积水地面的水花飞溅点云&#xff1a;【RAL2022】 模拟雨天点云…