62 不同路径
题目链接
思路
dp五部曲:
- dp[i][j]: 第i行第j列的方法数
- 状态转移方程:
dp[i][j] = dp[i][j-1] + dp[i-1][j]; - 初始化:
dp[1][1] = 1,为方便操作dp[][0]和dp[0][]初始化为0 - 遍历顺序:列优先
- 模拟:2 * 3,得到输出序列:1,1,1,1,2,3
文章详解
cpp
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m+1,vector<int>(n+1));
dp[1][1] = 1;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == 1 && j == 1)
{
continue;
}
dp[i][j] = dp[i][j-1] + dp[i-1][j];
cout << dp[i][j];
}
}
return dp[m][n];
}
};
63 不同路径II
题目链接
思路
dp五部曲:
- dp[i][j]: 第i行第j列的方法数
- 状态转移方程:
dp[i][j] = dp[i][j-1] + dp[i-1][j]; - 初始化:
dp[0][] = dp[][0] = 1,如果该节点为障碍物就跳过; - 遍历顺序:列优先
- 模拟:2 * 3,障碍物坐标(2,2)得到输出序列:1,1,1,1,0,1
文章详解
cpp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if(obstacleGrid.back().back() == 1) return 0;
if(obstacleGrid[0][0] == 1) return 0;
//cout << obstacleGrid.back().back();
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
//特殊情况处理:只有1行或只有1列,防止越界
if( n == 1)
{
for(int i = 0; i < m; i++)
{
if(obstacleGrid[i][0] == 1)
return 0;
}
return 1;
}
if(m == 1)
{
for(int i = 0; i < n; i++)
{
if(obstacleGrid[0][i] == 1)
return 0;
}
return 1;
}
vector<vector<int>> dp(m,vector<int>(n));
//初始化:需要注意ob之后的所有元素都不可直接到达,都为0
for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++) //注意for循环在第一次遇到障碍物会跳出
{
dp[i][0] = 1;
}
for(int j = 0; j < n && obstacleGrid[0][j] == 0; j++)
{
dp[0][j] = 1;
}
//return 0;
for(int i = 1; i < m; i++)
{
for(int j = 1; j < n; j++)
{
if(obstacleGrid[i][j] == 1)
{
continue;
}
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
// for(int i = 0; i < m; i++)
// {
// for(int j = 0; j < n; j++)
// {
// cout << dp[i][j] << ' ';
// }
// cout << endl;
// }
return dp[m-1][n-1];
}
};
343 整数拆分
题目链接
思路
这道题的关键在于dp的含义以及初始化。
刚拿到题分析:
2 = 1 + 1,最大值是1
3 = 1 + 2 = 1 + 1 + 1,最大值是2
4 = 1 + 3 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1,最大值是4
前者和后者的关联在哪里?
首先乘积公式应该是: j * (i- j),这里i-j可以进一步拆分,要找到i-j的拆分中的最大值。
因此,五部曲如下:
dp[i]的定义如下:数字i的拆分后最大乘积。
递推公式:dp[i] = max(dp[i], j * (i-j), j * dp[i-j]),这里的j要从1到i-1遍历.
初始化:dp[2] = 1,方便做题dp[1] = 1;
遍历顺序:从1到n
模拟:n = 5,输出序列为:1,1,2,4,6
文章详解
cpp
todo