C++算法第十一天

本篇文章我们继续学习动态规划

目录

第一题

题目链接

题目解析

代码原理

代码编写

第二题

题目链接

题目解析

代码原理

代码编写

第三题

题目链接

题目解析

代码原理

代码编写

第四题

题目链接

题目解析

代码原理

代码编写

第五题

题目链接

题目解析

代码原理

代码编写

题后总结


第一题

题目链接

题目解析

代码原理

代码编写

class Solution {

public:

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {

int m = obstacleGrid.size(), n = obstacleGrid0.size();

//建表

vector<vector<int>> dp(m + 1, vector<int>(n + 1));

//初始化

dp01 = 1;//当然这里dp10 = 1也是可以的

//填表

for(int i = 1; i <= m; i++)

{

for(int j = 1; j <= n; j++)

{

//状态转移方程

if(obstacleGridi - 1j - 1 == 0)

dpij = dpi - 1j + dpij - 1;

}

}

return dpmn;

}

};

第二题

题目链接

LCR 166. 珠宝的最高价值 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

int jewelleryValue(vector<vector<int>>& frame) {

int m = frame.size(), n = frame0.size();

//建表

vector<vector<int>> dp(m + 1, vector<int>(n + 1));

//初始化

dp01 = 0;

//填表

for(int i = 1; i <= m; i++)

{

for(int j = 1; j <= n; j++)

{

dpij = max(dpi - 1j, dpij - 1) + framei - 1j - 1;

}

}

return dpmn;

}

};

第三题

题目链接

931. 下降路径最小和 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

int minFallingPathSum(vector<vector<int>>& matrix) {

int n = matrix.size();

//建表

vector<vector<int>> dp(n + 1,vector<int>(n + 2, INT_MAX));

//初始化第一行

for(int j = 0; j < n + 2; j++)

{

dp0j = 0;

}

//填表

for(int i = 1; i < n + 1; i++)

{

for(int j = 1; j <= n; j++)

{

dpij = min(min(dpi - 1j - 1, dpi - 1j),dpi - 1j + 1) + matrixi - 1j - 1;

}

}

int ret = INT_MAX;

for(int j = 1; j <= n; j++)

{

ret = min(ret, dpnj);

}

return ret;

}

};

第四题

题目链接

64. 最小路径和 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

int minPathSum(vector<vector<int>>& grid) {

int m = grid.size(), n = grid0.size();

//建表

vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));

//初始化

dp01 = 0;

//填表

for(int i = 1; i <= m; i++)

{

for(int j = 1; j <= n; j++)

{

dpij = min(dpi - 1j,dpij - 1) + gridi - 1j - 1;

}

}

return dpmn;

}

};

第五题

题目链接

174. 地下城游戏 - 力扣(LeetCode)

题目解析

代码原理

这里的状态方程有个小错误需要注意一下,正确的我放在下面啦,别看漏哦

正确的状态转移方程:dpij = min(dpij + 1,dpi + 1j) - curij

代码编写

class Solution {

public:

int calculateMinimumHP(vector<vector<int>>& dungeon) {

int m = dungeon.size(),n = dungeon0.size();

//建表

vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));

//初始化

dpmn - 1 = dpm - 1n = 1;

//填表

for(int i = m - 1; i >= 0; i--)

{

for(int j = n - 1; j >= 0; j--)

{

dpij = min(dpij + 1, dpi + 1j) - dungeonij;

dpij = max(1,dpij);

}

}

return dp00;

}

};

题后总结

通过今天的题,我们可以总结出以下几点

1.填表时需要使用原表上的数据时,行列各减1

2.初始化部分的目的:保证填表时不越界

保证填表时后面的数据正确

3.如何正确初始化:结合状态表示和状态转移方程,进行分析哪些地方存在越界的可能性

那么本篇文章的内容就先到此结束,我们下期文章再见!!!

记得一键三联哦

相关推荐
星夜离尘564 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
Ai-_Man4 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd4 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
会编程的小孩5 小时前
C++ qt的安装
c++
学逆向的5 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_5 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
企业数字化笔记7 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!8 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小成2023032026510 小时前
C++~07补充
开发语言·c++
小郎君65810 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法