算法刷题-动态规划2
- 珠宝的最高价值
- 下降路径最小和
珠宝的最高价值
题目
大佬思路
多开一行使得代码更加的简洁
移动到右侧和下侧
dp[ i ][ j ]有两种情况:
第一种是从上面来的礼物最大价值:dp[ i ][ j ] = dp[ i - 1 ][ j ] + g[ i ][ j ]
第二种是从左面来的礼物最大价值:dp[ i ][ j ] = dp[ i ][ j - 1 ] + g[ i ][ j ]
所以得出状态表达式,dp[ i ][ j ] = max( dp[ i ][ j - 1 ],dp[ i - 1 ][ j ] ) + g[ i ][ j ]
2。为了简洁代码,多增加一行
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
//dp[i][j]表示从grid[0][0]到grid[i - 1][j - 1]时的最大价值
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
}
}
return dp[m][n];
}
}
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[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 - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
}
}
return dp[m][n];
}
};
下降路径最小和
头文件: #include< algorithm >
返回值: 两个函数返回的都是迭代器,所以要提取数值的话需要在函数前加上*
语法格式: max_element(first,end,cmp);其中cmp为可选择参数(自定义排序可用,默认不需要填)
两个函数默认都是从小到大排列, max_element() 输出最后一个值, min_element() 输出第一个值。
这里要特别注意:如果自定义排序是从大到小的, max_element() 和min_element() 的返回结果相反,也就是说max_element()返回的是最小值,min_element()返回的是最大值 。
- 定义函数dp[i][j] ,是关于路径到达 i,j 点的最小值
- 然后找 关系式,分析最后一点是从哪里得到的, 从左上方来:dp[ i - 1 ][ j - 1 ] + m[ i ][ j ],从正上方来:dp[ i - 1 ][ j ] + m[ i ][ j ], 从右上方来:dp[ i - 1 ][ j + 1 ] + m[ i ][ j ]
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n = matrix.size();
vector<vector<int>> dp(n, vector<int>(n));
copy(matrix[0].begin(), matrix[0].end(), dp[0].begin());
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) {
int mn = dp[i - 1][j];
if (j > 0) {
mn = min(mn, dp[i - 1][j - 1]);
}
if (j < n - 1) {
mn = min(mn, dp[i - 1][j + 1]);
}
dp[i][j] = mn + matrix[i][j];
}
}
return *min_element(dp[n - 1].begin(), dp[n - 1].end());
}
//INT_MAX = 2 ^ 31 - 1,INT_MIN = -2 ^ 31.
//防止越界,在左边,上面和右边都增加一行
//并且将第一行定义为0
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 2, INT_MAX));
for (auto& e : dp[0]) e = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1]))
+ matrix[i - 1][j - 1];
}
}
int ans = INT_MAX;
for (const auto& k : dp[m]) ans = min(ans, k);
return ans;
}
};