当前位置: 首页 > article >正文

dp_走方格(包含dfs分析,记忆化搜索)

类似题目解析:dp_最长上升子序列(包含dfs分析,记忆化搜索)-CSDN博客

题目链接:2067. 走方格 - AcWing题库

题目图片:

分析题目(dfs)

这个题目说有一个行为n行,列为m列,在这个长方形里从左上角走到右下角,只能往右走,或者往下——》翻译过来就是一个二维数组的某个值f[i][j]只有两个选择——变成f[i+1][j],或者变成f[i][j+1],求出方案数。(注意有个条件是不能走行号和列号同时为偶数的地方)

这种有多种选择题,显而易见先用dfs思考,

首先行号和列号同时为偶数——》选择不走

正常的——》可以选择走,也可以选择不走

到达最大值了——》也就是边界

上面就把dfs函数的具体思路分析出来了,下面展示代码——》

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;int n,m;int dfs(int x, int y) {if (x % 2 == 0 && y % 2 == 0) {return 0; // x和y均为偶数,无法移动,路径数为0}if (x == n && y == m) {return 1; // 到达终点,返回1条路径}int count = 0;if (x < n) count += dfs(x + 1, y);if (y < m) count += dfs(x, y + 1);return count;
}int main()
{scanf("%d%d",&n,&m);cout<<dfs(1,1);return 0;
}

上面代码其中的dfs函数就是按照一开始分析的方式写出来的,而先判断是不是都为偶数和先判断是不是到结尾点了的顺序不是很重要。

那么这个显而易见超时了,所以开始记忆化搜索优化—— 

记忆化搜索优化

▌核心思路:
在普通DFS中,若存在大量重复访问的相同状态参数组合,则需要用数组/哈希表存储该状态的答案,避免重复递归。

  • 状态定义:将递归函数的所有可变参数(如坐标、剩余步长、标记位等)作为状态维度
    (例:二维网格路径问题中,状态是坐标 (x,y)
  • 容器选择:优先用多维数组存储,若参数范围过大可用unordered_map等哈希结构

在递归函数的第一行检查当前状态是否已计算过(是否在数组里存储过),若存在缓存结果则直接返回,否则继续递归。

无论递归路径如何,在返回结果前必须将计算结果存入缓存容器。需特别注意:

  1. 所有分支都要存储结果(包括边界条件和中间状态)
  2. 存储时机:在计算完所有子状态后,通过mem[x][y] = result和return result来操作。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N=31;
int n,m;
int mem[N][N];int dfs(int x, int y) {if(mem[x][y])return mem[x][y];int p=0;if(x%2==0&&y%2==0){return 0;//这个不变成p=1是因为?//p=1 仅在到达终点时触发,表示找到一条合法路径。//而 x 和 y 均为偶数的坐标是非法停留点,此时没有任何合法路径能通过该点到达终点,因此必须返回 0。}if(x==n&&y==m){p=1;}if(x<n) p+=dfs(x+1,y);if(y<m) p+=dfs(x,y+1);mem[x][y]=p;return p;
}int main()
{scanf("%d%d",&n,&m);cout<<dfs(1,1);return 0;
}

dp

从记忆化搜索变成dp的核心规律
记忆化搜索中的递归参数与动态规划的状态维度必须保持严格对应关系。记忆化搜索的dfs(a,b,c)参数表即对应动态规划的dp[a][b][c]状态定义。

其次,如果刚开始dfs是从开始的1,1推到n,m的,那dp就要从最后开始递推回去。

所以动态规划的二维数组的两个维度范围定了

是从n到1,另一个从m到1。

其中的公式思路和记忆化搜索里的dfs函数一样。

这个数组表示的是从这个位置开始到n,m这个位置(符合题意的)的方案数

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N=31;
int n,m;
int f[N][N];int main()
{scanf("%d%d",&n,&m);//dpfor(int i=n;i>0;i--){for(int j=m;j>0;j--){if(i%2==0&&j%2==0){continue;}int p=0;if(i==n&&j==m){p=1;}if(i<n) p+=f[i+1][j];if(j<m) p+=f[i][j+1];f[i][j]=p;}}cout<<f[1][1]<<endl;return 0;
}

总结

这就是从dfs分析到记忆化搜索再到dp的方法,如果有进一步想学习,可以多练习几道题,主页有几道类似的题目分析,可以点赞收藏去看一看。

相关文章:

dp_走方格(包含dfs分析,记忆化搜索)

类似题目解析&#xff1a;dp_最长上升子序列&#xff08;包含dfs分析&#xff0c;记忆化搜索&#xff09;-CSDN博客 题目链接&#xff1a;2067. 走方格 - AcWing题库 题目图片&#xff1a; 分析题目&#xff08;dfs&#xff09; 这个题目说有一个行为n行&#xff0c;列为m列…...

软考 中级软件设计师 考点笔记总结 day01

文章目录 软考1.0上午考点下午考点 软考1.11、数值及其转换2、计算机内数据表示2.1、定点数 - 浮点数2.2、奇偶校验 和 循环冗余校验 (了解)2.3、海明码 &#xff08;掌握&#xff09;2.4、机器数 软考1.0 上午考点 软件工程基础知识&#xff1a; 开发模型、设计原则、测试方…...

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…...

K8S学习之基础十八:k8s的灰度发布和金丝雀部署

灰度发布 逐步扩大新版本的发布范围&#xff0c;从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器&#xff0c;观察其表现&#xff0c;再决定是否全面推广。 特点&…...

Java 深度复制对象:从基础到实战

目录 一、深度复制的概念二、实现深度复制的方法1. 使用序列化2. 手动实现深度复制 三、总结 在 Java 编程中&#xff0c;对象的复制是一个常见的需求。然而&#xff0c;简单的复制操作&#xff08;如直接赋值&#xff09;只会复制对象的引用&#xff0c;而不是创建一个新的对象…...

【前端】webstorm创建一个导航页面:HTML、CSS 和 JavaScript 的结合

文章目录 前言一、项目结构二、HTML 结构三、CSS 样式四、JavaScript 功能五、现代化风格优化htmlcssjavascript运行效果 总结 前言 在现代网页开发中&#xff0c;一个良好的导航栏是提升用户体验的重要组成部分。在这篇文章中&#xff0c;我将向您展示如何创建一个简单而完整…...

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具&#xff08;AI IDE&#xff09;——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro&#xff0c;支持切换满血版DeepSeek R1&V3&#xff0c; 可以帮助各阶段开发者与AI流畅协作&#xff0c;更快、更高质量地完…...

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…...

MySQL复习笔记

MySQL复习笔记 1.MySQL 1.1什么是数据库 数据库(DB, DataBase) 概念&#xff1a;数据仓库&#xff0c;软件&#xff0c;安装在操作系统&#xff08;window、linux、mac…&#xff09;之上 作用&#xff1a;存储数据&#xff0c;管理数据 1.2 数据库分类 关系型数据库&#…...

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…...

自我训练模型:通往未来的必经之路?

摘要 在探讨是否唯有通过自我训练模型才能掌握未来的问题时&#xff0c;文章强调了底层技术的重要性。当前&#xff0c;许多人倾向于关注应用层的便捷性&#xff0c;却忽视了支撑这一切的根本——底层技术。将模型简单视为产品是一种短视行为&#xff0c;长远来看&#xff0c;理…...

qt 操作多个sqlite文件

qt 操作多个sqlite文件 Chapter1 qt 操作多个sqlite文件1. 引入必要的头文件2. 创建并连接多个SQLite数据库3. 代码说明4. 注意事项 Chapter2 qt 多线程操作sqlite多文件1. 引入必要的头文件2. 创建数据库操作的工作线程类3. 在主线程中创建并启动多个工作线程4. 代码说明5. 运…...

【每日学点HarmonyOS Next知识】多继承、swiper容器、事件传递、滚动安全区域、提前加载网络图片

1、HarmonyOS ArkTS如何让一个类可以具备其他多个类的能力&#xff1f; ArkTS如何让一个类可以具备其他多个类的能力&#xff0c;类似于多继承。 接口支持多继承。类不支持&#xff0c;其只支持单继承。 &#xff08;报错&#xff1a;Classes can only extend a single class…...

DIY Tomcat:手写一个简易Servlet容器

在Java Web开发领域&#xff0c;Tomcat堪称经典&#xff0c;它作为Servlet容器&#xff0c;承载着无数Web应用的运行。今天&#xff0c;我将带大家一同探索如何手写一个简易的Tomcat&#xff0c;深入理解其底层原理。 一、背景知识 在开始之前&#xff0c;我们需要对几个关键…...

如何在Ubuntu上直接编译Apache Doris

以下是在 Ubuntu 22.04 上直接编译 Apache Doris 的完整流程&#xff0c;综合多个版本和环境的最佳实践&#xff1a; 注意&#xff1a;Ubuntu的数据盘VMware默认是20G&#xff0c;编译不够用&#xff0c;给到50G以上吧 一、环境准备 1. 安装系统依赖 # 基础构建工具链 apt i…...

基于ssm的物资进销存(全套)

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本货物进销管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#…...

【CVPR2025】 EVSSM:用状态空间模型高效去模糊

Efficient Visual State Space Model for Image Deblurring 论文信息 题目&#xff1a; Efficient Visual State Space Model for Image Deblurring 用于图像去模糊的高效视觉状态空间模型 源码&#xff1a;https://github.com/kkkls/EVSSM 创新点 提出了高效视觉状态空间模型…...

动态规划--斐波那契类型

目录 前言 1 第N个斐波那契数 2 爬楼梯 3 三步问题 4 使用最小花费爬楼梯 5 解码方法 总结 前言 本篇所讲的几个题目都是与斐波那契数的做法与思路类似的题目&#xff0c;所以直接放在一块解决了。 同时&#xff0c;由于第一次接触动态规划&#xff0c;我们也会讲解一…...

supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目

1. 安装 Gunicorn 在项目虚拟环境中安装 Gunicorn&#xff1a;2. 基本用法 配置文件 创建一个 Gunicorn 配置文件&#xff08;如 gunicorn_config.py&#xff09;&#xff0c;方便管理复杂配置。 示例 gunicorn_config.py&#xff1a; bind "0.0.0.0:8000" #…...

《Python实战进阶》No16: Plotly 交互式图表制作指南

No16: Plotly 交互式图表制作指南 Plotly是一款用来做数据分析和可视化的在线平台&#xff0c;功能真的是非常强大&#xff0c;它主要有以下特点&#xff1a; 图形多样化&#xff1a;在线绘制多种图形&#xff0c;比如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭…...

代码随想录算法训练营第22天 | 组合总和 分割回文串

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_…...

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …...

Linux云计算SRE-第十七周

1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...

lvgl在ubuntu中模拟运行

文章目录 前言具体的步骤 前言 lvgl是一个图像UI的开源框架&#xff0c;用于嵌入式的设备之中。 在学习lvgl时&#xff0c;我们最好是现在PC上模拟运行&#xff0c;所以我们学习lvgl的第一步可以说是在我们的电脑上搭建模拟的运行环境。 参考官方的操作 lvgl在ubuntu上模拟运…...

Unity引擎使用HybridCLR(华佗)热更新

大家好&#xff0c;我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司&#xff0c;在面试的时候很重要的一个点&#xff0c;就是会不会用Lua。使用Lua的原因很简单&#xff0c;就是为了热更新。   热更新游戏内容很重要。如果…...

【Linux】权限相关知识点

思考 我们平时使用Linux创建文件或目录时的默认权限是多少&#xff1f; [rootlocalhost test]# mkdir dir [rootlocalhost test]# touch file [rootlocalhost test]# ll total 0 drwxr-xr-x 2 root root 6 Mar 8 15:23 dir #755 -rw-r--r-- 1 root root 0 Mar 8 15:23 f…...

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)

1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...

vue3 vite项目安装eslint

npm install eslint -D 安装eslint库 npx eslint --init 初始化配置&#xff0c;按项目实际情况选 自动生成eslint.config.js&#xff0c;可以添加自定义rules 安装ESLint插件 此时打开vue文件就会标红有问题的位置 安装prettier npm install prettier eslint-config-pr…...

Python Flask框架学习汇编

1、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【附例子】》 讲解的特别清楚&#xff0c;每一步都…...

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…...