【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站】动态规划学习 的相关文章

  • 1746. 经过一次操作后的最大子数组和

    1746 经过一次操作后的最大子数组和 你有一个整数数组 nums 你只能将一个元素 nums i 替换为 nums i nums i 返回替换后的最大子数组和 示例 1 输入 nums 2 1 4 3 输出 17 解释 你可以把 4替换为
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

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

    描述 怪盗基德是一个充满传奇色彩的怪盗 专门以珠宝为目标的超级盗窃犯 而他最为突出的地方 就是他每次都能逃脱中村警部的重重围堵 而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼 有一天 怪盗基德像往常一样偷走了一颗珍贵的钻石 不料却被柯
  • 每日一题:路径计数

    路径计数 题目 Daimayuan Online Judge f i j 表示从左上角走到 i j 的方案数 状态转移 i j 由 i 1 j 和 i j 1 转移而来 初始状态 得使得f 1 1 为1 所以初始化f 1 0 或者f 0 1
  • 子串和子序列问题-动态规划向

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

    目录 1 评价模型 2 优化模型 3 分类模型 4 预测模型 本文主要介绍数学建模的四大模型分类 分别是评价模型 优化模型 分类模型 预测模型 关注公众号 数模乐园 回复 买 获得更多数模教程 1 评价模型 评价模型可以处理难于完全定量分析
  • [leetcode] 推多米诺 双指针

    题目链接 一开始想多了 像成了真实生活中的那种会叠加的状态 就比如 RRL 中 左边的两个 R 会让第三个 L 向右边倾斜 直接用前缀和进行操作 但是发现示例1都无法通过 所以说是错的 正确的想法是 每一个暂未确定状态的 都由这个字符两侧最
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • 华为od机考真题-HJ17坐标移动(中等)

    data input l r 0 0 for ad in data split ad
  • OJ刷题---【算法课动态规划] 换硬币(C++完整代码)

    题目 给定面值分别为2 5 7的硬币 每种硬币有无限个 给定一个N 求组成N最少需要的硬币的数量 若无法组成则返回 1 输入 输入N 1 lt N lt 100 输出 输出需要的最少硬币个数 完整代码 C include
  • 字节跳动笔试---字母交换,最多m次

    参考 https blog csdn net cxzzxc123456 article details 79058419 编码题 字符串S由小写字母构成 长度为n 定义一种操作 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交
  • 蓝桥杯:斐波那契数列最大公约数

    题目表示的很明确 要用两个算法 斐波那契数列是很经典的dp问题 最大公约数是很经典的辗转相除法 从而我理所应当的就定义一个数组存放斐波那契数列 long long int F 2021 0 F 1 1 F 2 1 for int i 3 i
  • 特殊类型动归--区间动归与环形动归

    区间动归 某类有序事件中前若干个事件的子答案 不能再支撑状态转移 我们需要去寻找 从某个元素起到另一个元素结束所包含所有的 连续 元素的子答案 作为状态 可以想象 在这个描述下 每个状态会对应于原题序列上的一个区间 区间具有良好的性质 短的
  • HJ103 Redraiment的走法

    Redraiment是走梅花桩的高手 Redraiment可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替Redraiment研究他最多走的步数吗 示例 2 5 1 5 4 5 输出 3 说明 6个点的
  • 【动态规划】从入门到实践---动态规划详解

    目录 1 动态规划概念 一 定义数组元素的含义 二 找到数组元素之间的关系表达式 三 找到初始值 2 案例详解 一 爬楼梯 1 定义数组元素的含义 2 找到数组元素之间的关系表达式 3 找到初始值 案例二 最短路径 题目 做题步骤 1 定义
  • 2023华为OD机试真题【星际篮球争霸赛/动态规划】

    题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场 并且让所有得分的选手得分都相同 然而比赛过程中的每1分钟的得分都只能由某一
  • 最大k乘积问题--动态规划

    问题 问题描述 设x是一个n位十进制整数 如果将x划分为k段 则可得到k个整数 这k个整数的乘积称为x的一个k乘积 试设计一个算法 对于给定的x和k 求出x的最大k乘积 编程任务 对于给定的x和k 编程计算x的最大k 乘积 示例 Sampl
  • Python之动态规划

    序言 最近在学习python语言 语言有通用性 此文记录复习动态规划并练习python语言 动态规划 Dynamic Programming 动态规划是运筹学的一个分支 是求解决策过程最优化的过程 20世纪50年代初 美国数学家贝尔曼 R
  • 【数位dp】【动态规划】C++算法:233.数字 1 的个数

    作者推荐 动态规划 C 算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode 233数字 1 的个数 给定一个整数 n 计算所有小于等于 n 的非负整数中数字 1 出现的个数 示例 1 输入 n 13 输出 6 示

随机推荐

  • 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