赞
踩
上篇文章我们简单入门了动态规划(一般都是简单的上楼梯,分析数据等问题)点我跳转,今天给大家带来的是路径问题,相对于上一篇在一维中摸爬滚打,这次就要上升到二维解决问题,但都用的是动态规划思想嘛,所以大差不差,且听我慢慢道来。
还是用一样的方法,用同样的分析思路和技巧来分析问题解决问题。
路径规划
不同路径
dp[i][j]=dp[i-1][j]+dp[i][j-1]
class Solution {
public:
int uniquePaths(int m, int n) {
//new出一个二维数组,并将他们的值初始化为0
vector<vector<int>> dp(m+1,vector<int>(n+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
第二道题
珠宝的最高价值
如果说上一道题对标的是上一篇中的上楼梯的方法数,那么这道题对标的就是上楼梯最小花费。
思路和上一道题目很像,一起来看一看。
dp[i][j]=max(dp[i-1][j],dp[i][j-1];
class Solution {
public:
int jewelleryValue(vector<vector<int>>& frame) {
int m=frame.size();
int n=frame[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j]=max(dp[i][j-1],dp[i-1][j])+frame[i-1][j-1];
return dp[m][n];
}
};
第三道题
下降路径最小和
首先来进行题目解析,这道题目只需要从上到下找到最小的路径即可,而且在某位置可以向下边三个位置进行跳转。
dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j+1],dp[i-1][j]))+matrix[i-1][j-1];//要注意这里位置的对应
这里状态对应的问题后边会解释到。
初始化
这里初始化是一个问题,问题在于在我们求第一行时,第一行的上边并没有数据,访问dp[-1][-1]势必会造成越界访问,如何解决呢?有了上边题目的铺垫,只需要扩展数组即可。
相信大家已经看到了上边的画图中分别用两种颜色标记,如何初始化才能不影响后续的结果呢?
因为这道题目的数组开的并不规则,所以对应位置容易混淆,如果你匆匆写代码的话,势必会出现这样的问题,
还会出现这样的问题
第一种就是没有空控制好dp表的填写,导致初始化时的INT_MAX参与了运算,第二种就是因为多开两列,多开一行导致的位置判断不准确,以至于越界访问了。
填表顺序
很明显,从上往下进行填表
返回值
这里返回值和之前不太一样,需要找到最后一行元素中最小的一个,然后返回即可。
代码如下,一定要尝试自己写一下,这道题是正方形表格,但是我作为长方形表格来做了,大家可以忽略这些小细节哈。
class Solution { public: int minFallingPathSum(vector<vector<int>>& matrix) { int m=matrix.size(); int n=matrix[0].size(); vector<vector<int>> dp(m+1,vector<int> (n+2,INT_MAX)); //怎么把两边初始化为int_max; //cout<<int_max; for(int k=0;k<=n+1;k++) { dp[0][k]=0; } for(int i=1;i<=m;i++) { for(int j=1;j<=n+1;j++)//这里要注意,只需要初始化我们需要的部分 { dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j+1],dp[i-1][j]))+matrix[i-1][j-1];//要注意这里位置的对应 } } //此时只需找到最后一行的最小值。 int ret=INT_MAX; for(int j=1;j<=n;j++) { ret=min(ret,dp[m][j]); } return ret; } };
本文到此结束,感谢大家观看,有问题及时提出,我会积极解决的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。