【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么?简答理解是dp表里的值所表示的含义怎么来的?题目要求经验+题目要求分析问题的过程中,发现重复子问题
2.状态转移方程dp[i]=......细节问题:3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候,所需要的状态已经填写好了5.返回值题目要求+状态表示空间优化滚动数组
  1. 第 N 个泰波那契数
int tribonacci(int n)
{// 处理一些边界情况if(n < 3){if(n == 0) return 0;else return 1;}// 1.创建dp表vector<int> dp(n + 1);// 2.初始化dp[0] = 0, dp[1] = 1, dp[2] = 1;for(int i = 3; i <= n; ++i){// 3.填表dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];}// 4.返回值return dp[n];
}
// 空间优化版本
int tribonacci(int n)
{int arr[3] = { 0,1,1 };if(n < 3) return arr[n];int ret = 0;for(int i = 3; i <= n; ++i){ret = arr[0] + arr[1] + arr[2];arr[0] = arr[1], arr[1] = arr[2], arr[2] = ret;}return ret;
}
  1. 三步问题
状态表示:经验+题目要求:以i位置为结尾来入手dp[i]: 表示到达i位置,一共有多少种方法
状态转移方程:基于i位置状态,跨一步到i位置,来划分问题
int waysToStep(int n)
{if(1 == n) return 1;else if(2 == n) return 2;else if(3 == n) return 4;// 1.dp数组vector<int> dp(n + 1);// 2.初始化dp[1] = 1, dp[2] = 2, dp[3] = 4;for(int i = 4; i <= n; ++i){// 3.状态方程dp[i] = ((dp[i - 1] + dp[i - 2]) % 1000000007 + dp[i - 3]) % 1000000007;}// 4.返回值return dp[n];
}
  1. 使用最小花费爬楼梯
状态表示:经验+题目要求:以i位置为结尾来入手dp[i]: 表示i位置到下一步的最小花费
状态转移方程:dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
int minCostClimbingStairs(vector<int>& cost)
{// 1.dp数组vector<int> dp(cost.size());// 2.初始化dp[0] = cost[0]; dp[1] = cost[1];for (int i = 2; i < dp.size(); ++i){// 3.状态转移方程dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];}// 4.返回值return min(dp[dp.size() - 1], dp[dp.size() - 2]);
}
  1. 解码方法
状态表示:经验+题目要求:以i位置为结尾来入手dp[i]: 表示以i位置为结尾时,解码方法的总数
状态转移方程:

在这里插入图片描述

int numDecodings(string s)
{// 0.边界情况if(s.size() < 2){if(s[0] == '0') return 0;else return 1;}// 1.dp数组vector<int> dp(s.size(), 0);// 2.初始化if (s[0] == '0') dp[0] = 0;else dp[0] = 1;if (s[0] != '0' && s[1] != '0') dp[1] += 1;if (10 <= stoi(s.substr(0, 2)) && stoi(s.substr(0, 2)) <= 26) dp[1] += 1;for(int i = 2; i < dp.size(); ++i){// 3.状态转移方程int num1 =0, num2 = 0;if(s[i] != '0') num1 = dp[i - 1];if(10 <= stoi(s.substr(i - 1, 2)) && stoi(s.substr(i - 1, 2)) <= 26) num2 = dp[i - 2];dp[i] = num1 + num2;}// 4.返回值return dp.back();
}
  1. 不同路径
状态表示:经验+题目要求:以[i,j]位置为结尾来入手dp[i][j]: 表示以[i,j]位置为finish时,从start出发的不同路径数
状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
int uniquePaths(int m, int n)
{// 1.dp数组vector<vector<int>> dp(m, vector<int>(n));// 2.初始化for (int i = 0; i < m; ++i){dp[i][0] = 1;}for (int i = 0; i < n; ++i){dp[0][i] = 1;}// 3.状态转移方程for (int row = 1; row < m; ++row){for (int col = 1; col < n; ++col){dp[row][col] = dp[row - 1][col] + dp[row][col - 1];}}// 4.返回值return dp.back().back();
}
  1. 不同路径 II
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{// 1.dp数组int m = obstacleGrid.size();int n = obstacleGrid[0].size();vector<vector<int>> dp(m, vector<int>(n));// 2.初始化for(int i = 0; i < m; ++i){if(obstacleGrid[i][0] == 1)break;dp[i][0] = 1;}for(int i = 0; i < n; ++i){if(obstacleGrid[0][i] == 1)break;dp[0][i] = 1;}// 3.状态转移方程for(int row = 1; row < m; ++row){for(int col = 1; col < n; ++col){if(obstacleGrid[row][col] == 1)continue;dp[row][col] = dp[row - 1][col] + dp[row][col - 1];}}// 4.返回值return dp.back().back();
}
  1. 珠宝的最高价值
状态表示:经验+题目要求:以[i,j]位置为结尾来入手dp[i][j]: 表示到达[i,j]位置时所能得到的的最大价值
状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + frame[i][j]
int jewelleryValue(vector<vector<int>>& frame)
{// 1.dp数组int row = frame.size();int col = frame[0].size();vector<vector<int>> dp(row, vector<int>(col));// 2.初始化dp[0][0] = frame[0][0];for(int i = 1; i < col; ++i){dp[0][i] = dp[0][i - 1] + frame[0][i];}for(int i = 1; i < row; ++i){dp[i][0] = dp[i - 1][0] + frame[i][0];}// 3.状态转移方程for(int i = 1; i < row; ++i){for(int j = 1; j < col; ++j){dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + frame[i][j];}}// 4.返回值return dp.back().back();
}
  1. 下降路径最小和
状态表示:经验+题目要求:以[i,j]位置为结尾来入手dp[i][j]: 表示到达[i,j]位置时所得到的最小下降路径和
状态转移方程:dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1]) + frame[i][j]
    int minFallingPathSum(vector<vector<int>>& matrix){// 1.dp数组int n = matrix.size();vector<vector<int>> dp(n, vector<int>(n));// 2.初始化for(int i = 0; i < n; ++i){dp[0][i] = matrix[0][i];}// 3.状态转移方程for(int i = 1; i < n; ++i){for(int j = 0; j < n; ++j){if(j == 0){dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + 1]) + matrix[i][j];}else if(j == n - 1){dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1]) + matrix[i][j];}else{dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i][j];}}}// 4.返回值int min_sum = dp[n - 1][0];for(int i = 1; i < n; ++i){if(dp[n - 1][i] < min_sum) min_sum = dp[n - 1][i];}return min_sum;}
  1. 最小路径和
状态表示:经验+题目要求:以[i,j]位置为结尾来入手dp[i][j]: 表示到达[i,j]位置时所得到的最小路径和
状态转移方程:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
int minPathSum(vector<vector<int>>& grid)
{// 1.dp数组int m = grid.size();int n = grid[0].size();vector<vector<int>> dp(m, vector<int>(n));// 2.初始化dp[0][0] = grid[0][0];for(int i = 1; i < m; ++i){dp[i][0] = dp[i - 1][0] + grid[i][0];}for(int i = 1; i < n; ++i){dp[0][i] = dp[0][i - 1] + grid[0][i];}// 3.状态转移方程for(int i = 1; i < m; ++i){for(int j = 1; j < n; ++j){dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}}// 4.返回值return dp.back().back();
}
  1. 地下城游戏
状态表示:经验+题目要求:以[i,j]位置为起点来入手dp[i][j]: 表示从[i,j]位置出发,到达终点,所需的最低初始健康点数
状态转移方程:dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];dp[i][j] = max(1, dp[i][j]); // 细节处理,健康点数至少为1才能存活
int calculateMinimumHP(vector<vector<int>>& dungeon)
{// 1.dp数组int m = dungeon.size();int n = dungeon[0].size();vector<vector<int>> dp(m, vector<int>(n));// 2.初始化if(dungeon[m - 1][n - 1] < 0) dp[m - 1][n - 1] = 1 - dungeon[m - 1][n - 1];else dp[m - 1][n - 1] = 1;for(int i = n - 2; i >= 0; --i){dp[m - 1][i] = dp[m - 1][i + 1] - dungeon[m - 1][i];dp[m - 1][i] = max(1, dp[m - 1][i]);}for(int i = m - 2; i >= 0; --i){dp[i][n - 1] = dp[i + 1][n - 1] - dungeon[i][n - 1];dp[i][n - 1] = max(1, dp[i][n - 1]);}// 3.状态转移方程for(int i = m - 2; i >= 0; --i){for(int j = n - 2; j >= 0; --j){dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];dp[i][j] = max(1, dp[i][j]);}}// 4.返回值return dp[0][0];
}

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

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

相关文章

腾讯云免费服务器配置大全和个人企业申请流程,2024年新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

蓝桥杯每日一题——棋盘

问题描述 小蓝拥有 n xn 大小的棋盘&#xff0c;一开始棋盘上全都是白子。小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0c;黑色棋子变为白色)请输出所有操作做完后棋盘上每个棋子的颜色。输入格式 输入的…

【每日前端面经】2024-03-17

【每日前端面经】2024-03-17 本期重点 —— Promise 欢迎订阅我的前端面经专栏&#xff1a;每日前端面经 Tips:每日面经更新从 2-22 到 3-15 已有 23 篇&#xff0c;最近愈发觉得内容相似度高&#xff0c;并且理解程度不深 于是临时停更面经&#xff0c;并将这些面经中的重…

卷积神经网络算法原理(卷积层,卷积运算,填充,步幅,经过卷积运算后的特征图大小,池化层,最大池化,平均池化,经过池化层运算后的特征图大小)

文章目录 卷积神经网络算法原理(卷积层&#xff0c;卷积运算&#xff0c;填充&#xff0c;步幅&#xff0c;经过卷积运算后的特征图大小&#xff0c;池化层&#xff0c;最大池化&#xff0c;平均池化&#xff0c;经过池化层运算后的特征图大小)前言1、图像的本质1.1、灰度图1.2…

Java学习笔记(16)

常见算法 查找算法 查询某个元素是否存在 二分查找&#xff08;数组元素必须是有序的&#xff09; package exercise;public class exercise1 {public static void main(String[] args) {int[] arr {7, 23, 797, 23, 79, 81, 103, 127, 131, 147};System.out.println(binar…

实战Python Socket编程:开发多用户聊天应用

实战Python Socket编程&#xff1a;开发多用户聊天应用 Python Socket 编程概述什么是Socket编程&#xff1f;Socket编程的应用场景Socket编程的重要性基本概念 环境准备Python版本必要的库开发环境配置调试工具 基本Socket编程创建Socket绑定Socket到端口监听连接接受连接发送…

C语言经典面试题目(七)

1、C语言中如何进行内存对齐和字节对齐&#xff1f; 在C语言中&#xff0c;内存对齐和字节对齐是为了优化内存访问速度和提高系统性能而进行的一种策略。内存对齐是指数据在内存中的存放位置必须是某个值的倍数&#xff0c;通常是数据类型的大小。字节对齐是指数据在内存中的存…

24.第12届蓝桥杯省赛真题题解

A.空间&#xff08;100%&#xff09; 计算机存储单位计算 1TB2^10 GB 1GB2^10 MB 1MB2^10 KB 1KB2&10 B 1B8 bit(bit位二进制的最小的存储单位) #include <iostream> #include <cmath>using namespace std; //2^28B 2^2int main(){std::ios::sync_with_stdio…

【C语言入门】浮点型数据在内存中的存储

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 ​编辑 引言 引例 一、浮点型在内存中的存储方式 1.1 …

在idea中配置tomcat服务器,然后部署一个项日

1.下载tomcat Tomcat下载 点击右边的tomcat8 找到zip点击下载 下载完&#xff0c;解压到你想放置的路径下 2.配置环境变量 打开设置找到高级系统设置点击环境变量 点击新建&#xff0c;变量名输入&#xff1a;CATALINA_HOME&#xff0c;变量值就是Tomcat的安装路径&#x…

【QT+QGIS跨平台编译】之七十七:【QGIS_Gui跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件一、字符串错误 常量中有换行符错误:(也有const char * 到 LPCWSTR 转换的错误) 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src\gui\qgsadvanceddigitizingdockwidge…

智慧礼金:电子礼金薄,让礼薄更添智能,你确定不进来看看?

智慧礼金&#xff1a;电子礼金薄&#xff0c;让礼薄更添智能&#xff0c;你确定不进来看看&#xff1f; 一、重要声明二、相关介绍三、使用好处四、如何找到该小程序 随着科技的不断进步&#xff0c;传统的纸质礼金簿已经逐渐被电子化管理所取代。今天&#xff0c;我们要向大家…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

1990-2022年各省全要素生产率数据(仅结果)

1990-2022年各省全要素生产率数据&#xff08;仅结果&#xff09; 1、时间&#xff1a;1990-2022年 2、指标&#xff1a;地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 3、范围&#xff1a;31省 4、计算说明&#xff1a; 产出指标&#x…

【自动化测试】如何在jenkins中搭建allure

相信大家在做自动化测试过程中&#xff0c;都会用到自动化测试环境&#xff0c;目前最常见的就是通过容器化方式部署自动化测试环境&#xff0c;但对于一些测试小白&#xff0c;不是很会搭建持续集成环境&#xff0c;特别是从0-1的过程&#xff0c;需要自行搭建很多依赖环境&am…

奇数乘积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 1;int j 3;//循环运算&#xff1b;while (j < 12){//运算&#xff1b;i i * j;//改变数值&#xff1b;j 2…

【2024-03-17】滴滴春招笔试两道编程题解

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。 作者@TechGuide【全网同名】 订阅专栏: 【专享版】2024最新大厂笔试真题解析,错过必后悔的宝藏资源! 第一题:陨石坠落打击 题目描述 小盖正在模拟陨石对地质的危害。在小盖…

rt-thread之通讯协议modbus软件包的使用记录(lwip+modbus组合)

前言 使用freemodbus软件包使用网口通讯(sallwip)ip地址使用dhcp动态获取 软件包 相关宏定义 /*-----------------------------------------NET 宏定义-------------------------------------------*/#define RT_USING_SAL #define SAL_INTERNET_CHECK /* Docking with prot…

JavaScript内置对象

JavaScript内置对象 1.字符串对象 var s"abcdef";console.log(s.length);console.log(s.charAt(2));console.log(s.indexOf("c"));console.log(s.substring(0,4)); //substring(开始位置&#xff0c;结束位置) abcdconsole.log(s.substr(2,4)); //sub…

vue3依赖注入(provide 和 inject)

依赖注入&#xff08;provide 和 inject&#xff09;&#xff0c;解决Prop 逐级透传问题。跨多组件转递参数&#xff0c;避免使用Prop 逐级透传。 1. 父组件要为组件后代提供数据&#xff0c;需要使用到 provide() 函数&#xff1a; <script setup> import { provide,re…