文章目录
前言
一、不同路径
1.状态表示
以[i,j]位置为结尾,...
结合本道题木:dp[i,j]:以【i,j】位置为结尾有多少条不同路径
2.状态转移方程
dp[i]是什么
dp[i][j]=dp[ i ][ j-1 ]+dp[ i-1 ][ j ];
3.初始化
我们填表时,第一行和第一列需要进行初始化操作。
我们可以多开一行和一列,用虚拟节点帮助我们进行初始化。
虚拟节点:
1.虚拟节点的值要保证填表是正确的
2.下标的映射
我们这里可以给成0,而dp[ 0 ][ 1 ]位置给成1.
4.填表顺序
从左到右,从上到下
5.返回值是什么
返回dp[ m ][ n]
6.代码编写
cpp
class Solution {
public:
int uniquePaths(int m, int n)
{
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
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];
}
};
二、下降路径最小和
1.状态表示
列出dp表,dp表中值的含义是什么
dp[i,j]:到达[i,j]位置,所有下降路径中最小和
2.状态转移方程
dp[i]是什么
dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j +
1])) + matrix[i][j] 。
3.初始化
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,需要「加上⼀⾏」,并且「加上两列」。
所有的位置都初始化为⽆穷⼤,然后将第⼀行,初始化为 0 即可
4.填表顺序
填表的顺序是「从上往下」
5.返回值是什么
返回「 dp 表中最后⼀⾏的最⼩值」
6.代码编写
cpp
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));
//第一行初始化为0
for(int i=0;i<n+2;i++)
{
dp[0][i]=0;
}
//填表
for(int i=1;i<=n;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 remin=INT_MAX;
for(int j=0;j<=n+1;j++)
{
remin=min(remin,dp[n][j]);
}
return remin;
}
};
总结
以上就是今天要讲的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘