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

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

记得一键三联哦

相关推荐
hahaha60162 分钟前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉
ebiobiz13 分钟前
极海 APM32 使用 Nimmake 编译指南
c++·python·单片机·嵌入式硬件·mcu
青山木14 分钟前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
朝朝辞暮i14 分钟前
C++ 第 26 课:对象、指针与 ->
java·开发语言·c++
夊1 小时前
C语言第十一课:指针(五)
算法
2601_962885721 小时前
如何用 Python 做股价历史分位选股?(筛出处于历史低位的股票)
开发语言·python
小师兄吃牛肉1 小时前
C语言指针进阶全解析
java·c语言·算法
梦帮科技1 小时前
vLLM / TensorRT-LLM 极限推理:PagedAttention 细粒度物理页表管理与连续批处理(Continuous Batching)实战
数据结构·人工智能·分布式·python·深度学习·算法·vllm
殷色玫瑰1 小时前
C++入门基础复习:从命名空间到引用与nullptr,一篇重新捡回C++基础
java·开发语言·c++
(Charon)2 小时前
【C++面试】手写线程池:任务队列、工作线程与优雅退出
开发语言·c++