赞
踩
即使走的再远,也勿忘启程时的初心
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,如果给算法的难度和复杂度排一个排名,那么动态规划算法一定名列前茅。今天,我们通过由简单到困难的两道题目带大家学会动态规划中的路径问题
题目题意理解相对比较简单,就先说到这里
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
这里教给大家一个做动态规划会经常使用的初始化方法
可以在dp表最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
好了,相信到这里大家还是一头雾水,下面我来展开讲讲
完成上面的算法原理分析,下面我们来具体写一下代码
class Solution { public: int uniquePaths(int m, int n) { //开辟m*n的dp表 vector<vector<int>>dp(m+1); for(int i=0;i<dp.size();i++) { dp[i].resize(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]; } };
dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j +1])) + matrix[i][j]
dp[i][j]=min+matrix[i][j]
就需要改成dp[i][j]=min+matrix[i-1][j-1]
,这样才能满足对应的下标关系class Solution { public: int minFallingPathSum(vector<vector<int>>& matrix) { int n=matrix.size(); //创建dp表 vector<vector<int>>dp(n+1,vector<int>(n+2)); //初始化 for(int i=1;i<=n;i++) { dp[i][0]=dp[i][n+1]=999999; } //填dp表 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { //状态转移方程 int ret=min(dp[i-1][j],min(dp[i-1][j+1],dp[i-1][j-1])); //之前的值加上此时这里数组的值 dp[i][j]=ret+matrix[i-1][j-1]; } } //找最后一行的最小值 int min1=dp[n][1]; for(int i=2;i<=n;i++) { if(dp[n][i]<min1) min1=dp[n][i]; } return min1; } };
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。