动态规划之路径规划01
动态规划之路径规划01
前言:虽然自己做过几个动态规划的题目,看过题解后也能做出几个二维的路径问题,主要是对dfs进行优化。但是还是有点知其然不知其所以然的感觉,有两个月左右没做dp,现在让我写对一个二维路径dp都困难。所以开这个专题系统学习dp。
感谢:宫水三叶
本笔记根据三叶大佬的刷题日记进行学习记录。
动态规划解决什么样的问题?
答: 仅关心某个状态,而不关系状态如何转移过来(这句话很深奥,仔细体会)。常与dfs等搜索结合在一起,会保存子状态的解,且仅访问/遍历/执行一次,后续重复访问可直接利用此结果。
动态规划有相当多种类,其中最常见的就是路径问题和背包问题
首先从路径问题开始着手
解决路径动态规划的方法:
(以下是之前我自己总结的经验)
1.确定状态转移方程。
2.路径问题中遍历的方向。
做了专题训练后的总结:
1.迭代方程
迭代方程根据边界判断的不同也会存在变化
2.迭代方向
与遍历的方向和路径的方向选择有关
3.初始条件
一般是最开始源点对应的dp值,赋值操作
4.边界条件
边界时的迭代方程和一般迭代方程有一点差异
dp第一题试试手:
62. 不同路径
class Solution {
public:
int uniquePaths(int m, int n) {
int a[m][n];
a[0][0]=1;
//迭代方程:a[m][n]=a[m-1][n]+a[m][n-1];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i>0 && j>0){
a[i][j]=a[i-1][j]+a[i][j-1];
}else if(i>0){
a[i][j]=a[i-1][j];
}else if(j>0){
a[i][j]=a[i][j-1];
}
}
}
return a[m-1][n-1];
}
};
本题迭代方程:a[m][n]=a[m-1][n]+a[m][n-1]
迭代方向:右和下
边界情况:上边缘,左边缘