【B站】动态规划学习

2023-11-10

https://www.bilibili.com/video/BV1ET4y1U7T6?p=6&spm_id_from=pageDriver

暴力递归到动态规划

在这里插入图片描述

//测试用例
#include <iostream>

using namespace std;
int** dp1 = nullptr;
int** dp2 = nullptr;
int way1(int N, int M, int K, int P);//暴力递归
int process1(int N, int M, int K, int P);//暴力递归过程
int way2(int N, int M, int K, int P);//暴力递归优化
int process1(int N, int M, int K, int P, int** dp);//暴力递归引入dp
int way3(int N, int M, int K, int P);//动态规划


int main()
{
	  N,M,K,P
	cout << way1(4, 2, 4, 4) << endl;
	cout << way2(4, 2, 4, 4) << endl;
	cout << way3(4, 2, 4, 4) << endl;

	for (int i = 0; i <= 4; i++)
	{
		delete[] dp1[i], dp2[i];
	}
	delete[] dp1, dp2;
	dp1 = dp2 = nullptr;
	return 0;
}

//N个位置,机器人在M位置上,必须走K步,最终来到P位置上
int way1(int N, int M, int K, int P)//暴力递归
{
	if (N < 2 || K < 1 || M<1 || M>N || P<1 || P>N)
	{
		return 0;
	}
	return process1(N, M, K, P);
}

int process1(int N, int M, int K, int P)
{
	if (K == 0)//已经不需要走
	{
		return M == P ? 1 : 0;
	}
	if (M == 1)//第一个位置,只能往下走
	{
		return process1(N, 2, K - 1, P);
	}
	else if (M == N)//最后的位置,只能往上走
	{
		return process1(N, N - 1, K - 1, P);
	}
	//中间位置上
	return process1(N, M + 1, K - 1, P) + process1(N, M - 1, K - 1, P);
}

int way2(int N, int M, int K, int P)
{
	if (N < 2 || K < 1 || M<1 || M>N || P<1 || P>N)
	{
		return 0;
	}
	int** dp = new int*[N + 1];
	for (int i = 0; i <= N; i++)
	{
		dp[i] = new int[K + 1];
		for (int j = 0; j <= K; j++)
		{
			dp[i][j] = -1;
		}
	}
	dp1 = dp;//释放内存用
	//dp就是缓存表
	//dp[M][K] == -1代表之前没算过;!= -1代表之前的算过
	 process1(N, M, K, P,dp);
	 //打印结果,方便验证
	 for (int i = 1; i <= N; i++)
	 {
		 for (int j = 0; j <= K; j++)
		 {
			 cout << dp[i][j] << "\t";
		 }
		 cout << endl;
	 }
	 return dp[M][K];
}

int process1(int N, int M, int K, int P, int** dp)
{
	if (dp[M][K] != -1)//之前算过
	{
		return dp[M][K];
	}
	//没算过,就去算答案
	int ans = 0;
	if (K == 0)
	{
		ans = M == P ? 1 : 0;
	}
	else if (M == 1)
	{
		ans = process1(N, 2, K - 1, P, dp);
	}
	else if (M == N)
	{
		ans = process1(N, N - 1, K - 1, P, dp);
	}
	else
	{
		ans = process1(N, M + 1, K - 1, P, dp) + process1(N, M- 1, K - 1, P, dp);
	}
	dp[M][K] = ans;
	return ans;
}


int way3(int N, int M, int K, int P)
{
	if (N < 2 || K < 1 || M<1 || M>N || P<1 || P>N)
	{
		return 0;
	}
	int** dp = new int* [N + 1];
	for (int i = 0; i <= N; i++)
	{
		dp[i] = new int[K + 1];
		memset(dp[i], 0, sizeof(dp[i]));
	}
	dp2 = dp;//释放内存用
	dp[P][0] = 1;//第一列的值
	for (int rest = 1; rest <= K; rest++)//数组大小为(N+1)*(K+1),第一列只有目的(P,0)为1,其他为0
	{
		dp[1][rest] = dp[2][rest - 1];//第一行只依赖第二行
		for (int cur = 2; cur < N; cur++)
		{
			dp[cur][rest] = dp[cur - 1][rest - 1] + dp[cur + 1][rest - 1];
		}
		dp[N][rest] = dp[N - 1][rest - 1];//最后一行只依赖前一行
	}
	for (int i = 1; i <= N; i++)
	{
		for (int j = 0; j <= K; j++)
		{
			cout << dp[i][j] << "\t";
		}
		cout << endl;
	}
	return dp[M][K];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【B站】动态规划学习 的相关文章

  • 洛谷 P1026 [NOIP2001 提高组] 统计单词个数

    题目描述 给出一个长度不超过 200 的由小写英文字母组成的字母串 该字串以每行 20 个字母的方式输入 且保证每行一定为 20 个 要求将此字母串分成 k 份 且每份中包含的单词个数加起来总数最大 每份中包含的单词可以部分重叠 当选用一个
  • (牛客网)华为机试(二)

    牛客网 华为机试题集解答 在解题前先分享一波oj刷题的固定格式代码 方便输入时使用 import java util import java io public class Main 一定要使用Main作为类名 public static
  • 2023华为OD机试真题Java实现【士兵过河/动态规划】

    题目内容 一支N个士兵的军队正在趁夜色逃亡 途中遇到一条湍急的大河 敌军在T的时长后到达河面 没到过对岸的士兵都会被消灭 现在军队只找到了1只小船 这船最多能同时坐上2个士兵 1 当1个士兵划船过河 用时为 a i 0 lt i lt N
  • 基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果 2 1 Dijkstra算法 2 2 A 算法 2 3 动态规划 3 Matlab代码实现 1 概述 在基
  • LeetCode:动态规划中的子序列问题

    PS 本文是参考代码随想录做的一些笔记 完整版本请戳链接 非常好的教程 本文列举了一些经典题目 特别是编辑距离 基本上的题目解题思路都是一样的 可以说是一个路子 300 最长递增子序列 给你一个整数数组 nums 找到其中最长严格递增子序列
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 删除与获得点数--动态规划

    Leetcode 740 删除与获得点数 题目描述 给定一个整数数组 nums 你可以对它进行一些操作 每次操作中 选择任意一个 nums i 删除它并获得 nums i 的点数 之后 你必须删除每个等于 nums i 1 或 nums i
  • 【AcWing30】正则表达式匹配(动态规划)

    dp i j 表示 s 0 i 的字符串与p 0 j 的字符串是否匹配 那么有以下几个转换状态 1 p j 1 是字母 而且与 s i 1 相等 那么当前dp i j 是否匹配就依赖于dp i 1 j 1 2 p j 1 是 那么肯定与s
  • 子串和子序列问题-动态规划向

    1 子串子序列问题概述 有关于子序列和子串的问题是字符串或者数组经常会遇到的问题 一般我们经常使用多指针 滑动窗口 回溯 动态规划的方式去解决 而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问题和子序列问题 1 1 子串 子
  • 【类】二维dp:动态规划背包问题

    dp n m 含义就是 当有n种物品时且背包有m容量时 这个背包能产生的最大价值 状态转换关系是 dp n m dp n 1 m dp n 1 m 新物品重量 意思就是 当面对新来的一个物品时 求这个情况下 背包能产生的最大价值 相当于求下
  • 【算法-LeetCode】63. 不同路径 II(动态规划;滚动数组)

    63 不同路径 II 力扣 LeetCode 文章起笔 2021年11月13日16 28 08 问题描述及示例 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达
  • 试除法判定质数模板题

    试除法判定一个数是否为质数类似于这道题 代码 include
  • 2020算法设计与分析 官方考前模拟卷 参考答案

    算法设计与分析 样例试题 算法设计与分析总结笔记 注 此试题仅供了解题型 和期末考试试题没有任何直接关系 FBI Warning 这套题难度较大 千万不要坏了心态 xj大佬说要是考试那么难他直播粪坑蝶泳 Power By 王宏志教授 5 分
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • 学习动态规划-子矩阵

    1 全为1的最大正方形 在一个由 0 和 1 组成的二维矩阵内 找到只包含 1 的最大正方形 并返回其面积 来源 221 最大正方形 解题思路 dp i j 表示以matrix i j 为右下角的全1的正方形的最大边长 很明显 当matri
  • LCR 005. 最大单词长度乘积----位掩码的使用

    题目描述 给定一个字符串数组 words 请计算当两个字符串 words i 和 words j 不包含相同字符时 它们长度的乘积的最大值 假设字符串中只包含英语的小写字母 如果没有不包含相同字符的一对字符串 返回 0 示例 1 输入 wo
  • 3254 Corn Fields 这题解真的不能再详细了!

    题意 农场主John新买了一块长方形的新牧场 这块牧场被划分成 M M M行 N N N列 1
  • Python之动态规划

    序言 最近在学习python语言 语言有通用性 此文记录复习动态规划并练习python语言 动态规划 Dynamic Programming 动态规划是运筹学的一个分支 是求解决策过程最优化的过程 20世纪50年代初 美国数学家贝尔曼 R
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪

随机推荐

  • jedis 出现java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long

    问题 使用jedis出现java lang ClassCastException java util ArrayList cannot be cast to java lang Long 解决办法 参考文章 http hellojimmy
  • 【设计模式】创建者模式_工厂、抽象工厂、建造者

    设计模式六大原则 开闭原则 Open Close Principle 开闭原则就是说对扩展开放 对修改关闭 在程序需要进行拓展的时候 不能去修改原有的代码 而是要扩展原有代码 单一职责原则 不要存在多于一个导致类变更的原因 也就是说每个类应
  • 若依框架_05:接口汇总

    若依接口汇总 一 登录 路由渲染 1 1 登录 1 1 1 登录 1 1 2 注册 1 1 3 获取验证码 1 1 4 获取用户详细信息 1 1 5 登出 1 2 路由渲染 1 2 1 获取路由 二 系统管理模块 2 1 用户管理 2 1
  • javascript中defer和async 区别

    defer和async 区别 1 没有 defer 或 async 浏览器会立即加载并执行指定的脚本 立即 指的是在渲染该 script 标签之下的文档元素之前 也就是说不等待后续载入的文档元素 读到就加载并执行 2 有 async 加载和
  • 递归函数的例子python卖鸭子_递归算法实现卖鸭子

    问题重述 1 一个人赶着鸭子去每个村庄卖 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 问他出发时共赶多少只鸭子 经过每个村子卖出多少只鸭子 代码 题目分析 设在经过n 个村子时有xn 只鸭子 根据题意可以得到
  • MATLAB算法实战应用案例精讲-【集成算法】集成学习模型Bagging(附Python和R语言代码)

    目录 前言 几个相关概念 几个高频面试题目
  • 阿里云-MaxComputer学习+踩坑 第001天

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 DataWorks是什么 二 MaxComputer是什么 1 产品介绍 2 表分区规范 3 官方分区文档 总结 前言 由于公司 一家蒸蒸日上的小跨境电商
  • [搬运]台湾大学机器学习课程 by 李宏毅

    最近看到一个比较好的机器学习课程 大致听了一遍 整体感觉机器学习领域还是比较难 虽然李宏毅老师讲得还是挺好的 没有足够基础吸收起来还是有一定困难 即便是已经把过程讲了一遍 也很难理解到那些理论是如何构建起来的 这个课程一个好是讲到了当前最热
  • 科目一考试系统服务器奔溃,科目一错误率最高的题 学员都崩溃了

    2017 02 28 09 07 59 做错这种基础题目的时候 与其有时间责怪出题人套路太深 不如反省一下自己为什么做题的时候没有多看选项一眼 在学习科目一的时候 很多学员都对科目一的题目感到头疼 有的是因为交通法规太难背 有的是对绕人的题
  • css video 样式,使用CSS修改 video 标签默认样式

    使用CSS修改 video 标签默认样式 时间 2019 11 08 17 42 14 来源 作者 效果展示 1 模拟直播 去除进度条 当前观看时间 剩余时间 效果 2 去除 video 标签全部控件 效果 Tags CSS 点击 评论 声
  • 10x倍加速PDE的AI求解:元自动解码器求解参数化偏微分方程

    研究背景 科学和工程中的许多应用需要求解具有不同方程系数 不同边界条件甚至不同求解域形状的偏微分方程 Partial Differential Equation PDE 即需要求解一个方程族而不是单个方程 这类应用经常在反问题求解 控制和优
  • 关于RxJava最友好的文章

    本篇文章已授权微信公众号 guolin blog 郭霖 独家发布 RxJava到底是什么 让我们直接跳过官方那种晦涩的追求精确的定义 其实初学RxJava只要把握两点 观察者模式和异步 就基本可以熟练使用RxJava了 异步在这里并不需要做
  • urllib.request.urlopen详解

    视频链接https www bilibili com video BV1Us41177P1 p 2 requests get详解见 https blog csdn net qq 41845823 article details 119516
  • 基于Multisim的四人抢答器设计与仿真

    功能 1 抢答器最多可供4名选手参赛 编号为1 4号 各队对应用一个按钮S1 S4中一个控制 并设置一个清零和抢答控制开关S5 该开关由主持人控制 2 抢答器具有锁存功能 直到主持人 清零 3 开关S作为清零及抢答控制开关 由主持人控制 当
  • 关于Navicat 报错1251连接不成功Mysql

    使用Navicat 连接数据库时候出现1251错误 解决方法 1 首先打开mysql exe 然后输入密码 mysql exe可以在安装的位置搜索一下 2 输入ALTER USER root localhost IDENTIFIED WIT
  • C#WinForm界面: 使用IrisSkin4实现美化换肤

    记录IrisSkin4应用过程 方便以后参考 步骤一 在网上下载IrisSkin4 dll和它的皮肤文件 步骤二 复制以下两个文件到winfrom项目的Debug文件夹下 步骤三 引用IrisSkin4 dll文件 步骤四 在工具箱空白处点
  • 数字图像处理(冈萨雷斯 第三版)

    1 1 图像与图像处理的概念 图像 Image 使用各种观测系统以不同形式和手段观测客观世界而获得的 可以直接或间接作用于人眼并进而产生视觉的实体 包括 各类图片 如普通照片 X光片 遥感图片 各类光学图像 如电影 电视画面 客观世界在人们
  • MySQL——索引详解

    目录 一 为什么要有索引 二 什么是索引 三 索引的原理 四 MySQL的存储引擎 五 索引的数据结构 六 聚簇和非聚簇索引 七 索引的设计原则 一 为什么要有索引 一般的应用系统 读写比例在10 1左右 而且插入操作和一般的更新操作很少出
  • 系统分析中的决策问题

    例如你设计一个图书馆系统支持用户预订被借出的书籍 有两个解决方案 一是 每一本书被归还时校验是否有人预订 如有预订则以某种方式如短信等通知预订客户 同时书籍做另类处理不会被流入馆内以节省时间 但是问题是预订的客户要来走一个预订的流程即管理员
  • 【B站】动态规划学习

    https www bilibili com video BV1ET4y1U7T6 p 6 spm id from pageDriver 暴力递归到动态规划 测试用例 include