第一步. 找出dp状态的定义
第二步. 找到dp递推方程
Leetcode120. 三角形的最小路径和 动态规划 时间复杂度 O(m*k) 空间复杂度 O(m*k)
一种较为好理解的解法,定义一个二维的数组 dp, 状态 存放在二维数组中
dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]
对dp二维数组初始化,将二维数组的最后一行用 原二维数组的最后一行进行初始化
//动态规划
// dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j];
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle)
{
int len = triangle.size();
if(len <= 0)
return 0;
vector<vector<int>> dp(len, vector<int>(triangle[len-1].size()));
for(int i = 0; i < triangle[len-1].size(); i++) //初始一个dp 递推必须的过程,要有递推的原始值
dp[len -1][i] = triangle[len-1][i];
for(int i = len - 2; i >= 0; --i) //从倒数第一行向上递推
{
for(int j = 0; j < triangle[i].size(); ++j)
{
dp[i][j] = triangle[i][j] + min(dp[i+1][j], dp[i+1][j+1]); //递推方程
}
}
return dp[0][0]; //推到顶部就是路径最小的和
}
};
Leetcode62. 不同的路径 //动态规划,较为好理解的动态规划 //dp[i][j] = dp[i][j-1] + dp[i-1][j]; ..这道题应该规划为简单
//动态规划,较为好理解的动态规划
//dp[i][j] = dp[i][j-1] + dp[i-1][j];
class Solution {
public:
int uniquePaths(int m, int n)
{
if(m <= 0 || n <= 0)
return 0;
vector<vector<int>> dp(m, vector<int>(n));
dp[0][0] = 1;
for(int i = 1; i < n; i++)
dp[0][i] = 1;
for(int j = 1; j < m; j++)
dp[j][0] = 1;
for(int i = 1; i < m; i++)
{
for(int j = 1; j < n; j++)
{
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
return dp[m-1][n-1];
}
};
Leetcode62. 不同的路径 //动态规划,较为好理解的动态规划 //dp[i][j] = dp[i][j-1] + dp[i-1][j];
只是动态规划中要判断路径中有没有存放石头,起始路径 和 终点是否是石头,如果是直接返回0,路不通则为0; 类型用long long 类型,int 会益处
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
long long m = obstacleGrid.size();
long long n = obstacleGrid[0].size();
if(m <= 0 || n <= 0 || obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0])
return 0;
vector<vector<long long>> dp(m, vector<long long>(n, 0));
dp[0][0] = 1;
for(int i = 1; i < n; ++i) //初始 横坐标为0 纵坐标的值
{
if(obstacleGrid[0][i] == 1)
break;
else
dp[0][i] = 1;
}
for(int j = 1; j < m; ++j) //初始 纵为0 横坐标的值
{
if(obstacleGrid[j][0] == 1)
break;
else
dp[j][0] = 1;
}
for(int i = 1; i < m; ++i)
for(int j = 1; j < n; ++j)
{
if(obstacleGrid[i][j] == 1) //判断该节点有石头 则路不通
dp[i][j] = 0;
else
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
return dp[m-1][n-1];
}
};