创作不易,感谢三连支持!
路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。大多需要用二维dp数组去实现
一、不同路径
. - 力扣(LeetCode)不同路径
class Solution {
public:
int uniquePaths(int m, int n)
{
vector<vector<int>> dp(m+1,vector<int>(n+1));//创建一个有辅助节点的数组
//初始化dp[0][1]画图去理解
dp[0][1]=1;
//开始填表
for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) dp[i][j]=dp[i-1][j]+dp[i][j-1];
return dp[m][n];
}
};
二、不同路径2
. - 力扣(LeetCode)不同路径2
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
int m=obstacleGrid.size(),n=obstacleGrid[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));//创建一个dp数组
//初始化dp[0][1]
dp[0][1]=1;
//开始填表
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
if(obstacleGrid[i-1][j-1]==0)//判断自己当前的格子是不是障碍物
dp[i][j]=dp[i-1][j]+dp[i][j-1];
return dp[m][n];
}
};
三、珠宝的最高价值
. - 力扣(LeetCode)珠宝的最高价值
class Solution {
public:
int jewelleryValue(vector<vector<int>>& frame)
{
int m=frame.size(),n=frame[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));//创建一个dp数组
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i-1][j-1];
return dp[m][n];
}
};
四、最小路径和
. - 力扣(LeetCode)最小路径和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid)
{
int m=grid.size(),n=grid[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
dp[0][1]=0;
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-1][j-1];
return dp[m][n];
}
};
五、下降路径最小和
. - 力扣(LeetCode)下降路径最小和
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix)
{
int m=matrix.size(),n=matrix[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+2,INT_MAX));//加一行,多加两列,两列得是INT MAX
for(int j=0;j<n+2;++j) dp[0][j]=0;//第一行初始化成0
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i-1][j-1];
//找需要返回的值
int ret=INT_MAX;
for(int j=1;j<=n;++j) ret=min(ret,dp[m][j]);
return ret;
}
};
六、地下城游戏
. - 力扣(LeetCode)地下城游戏
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon)
{
int m=dungeon.size(),n=dungeon[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
dp[m-1][n]=1;
for(int i=m-1;i>=0;--i)
for(int j=n-1;j>=0;--j)
{
int mini=min(dp[i+1][j],dp[i][j+1]);
dp[i][j]=max(mini-dungeon[i][j],1);//要防止出现大血包
}
return dp[0][0];
}
};