leetcode 64.最小路徑和
題目
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。
說明:每次只能向下或者向右移動一步。
示例
輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 因爲路徑 1→3→1→1→1 的總和最小。
代碼
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.size() == 0 || grid[0].size() == 0) return 0;
vector<vector<int>> dp(grid.size(), vector<int>(grid[0].size()));
int leni = grid.size()-1, lenj = grid[0].size()-1;
dp[leni][lenj] =grid[leni][lenj];
for(int j = lenj-1; j >=0; j--)
dp[leni][j] = dp[leni][j+1]+grid[leni][j];
for(int i = leni-1; i >=0; i--){
dp[i][lenj] = dp[i+1][lenj]+grid[i][lenj];
}
for(int i = leni-1; i>=0; i-- ){
for(int j = lenj-1; j >=0; j--){
dp[i][j] = min(dp[i][j+1], dp[i+1][j])+grid[i][j];
}
}
return dp[0][0];
}
};
leetcode931. 下降路徑最小和
題目
給定一個方形整數數組 A,我們想要得到通過 A 的下降路徑的最小和。
下降路徑可以從第一行中的任何元素開始,並從每一行中選擇一個元素。在下一行選擇的元素和當前行所選元素最多相隔一列。
示例
輸入:[[1,2,3],[4,5,6],[7,8,9]]
輸出:12
解釋:
可能的下降路徑有:
+ [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
+ [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
+ [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
和最小的下降路徑是 [1,4,7],所以答案是 12。
代碼
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
if(A.size() == 0 || A[0].size() == 0) return 0;
int leni = A.size(), lenj = A[0].size();
vector<vector<int>> dp(leni, vector<int>(lenj));
for(int j = lenj-1; j >= 0; j--)dp[leni-1][j] = A[leni-1][j];
for(int i = leni - 2; i >= 0; i--){
for(int j = lenj-1; j >= 0; j--){
if(j == 0){
dp[i][j] = min(dp[i+1][j],dp[i+1][j+1]) + A[i][j];
}
else if(j == lenj -1){
dp[i][j] = min(dp[i+1][j-1], dp[i+1][j]) + A[i][j];
}else{
dp[i][j] = min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1])) + A[i][j];
}
}
}
int res = INT_MAX;
for(int j = 0; j < lenj; j++) res = min(res, dp[0][j]);
return res;
}
};
leetcode 1289. 下降路徑最小和 II
題目
給你一個整數方陣 arr ,定義「非零偏移下降路徑」爲:從 arr 數組中的每一行選擇一個數字,且按順序選出來的數字中,相鄰數字不在原數組的同一列。
請你返回非零偏移下降路徑數字和的最小值。
示例
輸入:arr = [[1,2,3],[4,5,6],[7,8,9]]
輸出:13
解釋:
所有非零偏移下降路徑包括:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
下降路徑中數字和最小的是 [1,5,7] ,所以答案是 13 。
代碼
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& arr) {
int leni = arr.size(), lenj = arr[0].size();
if(leni == 0 || lenj == 0) return 0;
vector<vector<int>> dp(leni, vector<int>(lenj));
for(int j = lenj-1; j >= 0; j--)dp[leni-1][j] = arr[leni-1][j];
for(int i = leni - 2; i >= 0; i--){
for(int j = lenj-1; j >= 0; j--){
int res = INT_MAX;
for(int k = lenj-1; k >= 0; k--){
if(k == j) continue;
else{
res = min(res, dp[i+1][k]);
}
dp[i][j] = res + arr[i][j];
}
}
}
int res = INT_MAX;
for(int j = 0; j < lenj; j++) res = min(res, dp[0][j]);
return res;
}
};