给定一个填充非负数的m×n网格,找到一条从左上到右下的路径,这个路径将所有数字的总和最小化。
2017-12-18 11:27
525 查看
本题源自leetcode 64
-------------------------------------------------------------------
思路 : 动态规划
1 用一个二维数组dp[i][j]记录到达 i,j 所需要的最小路径和。考虑边界条件。
2 优化 :用一个一维数组来记录到达某一列,需要的最小路径和。
代码:
int minPathSum(vector<vector<int>>& grid) {
/*
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
if(col == 0)
return 0;
vector<vector<int>> dp(row,vector<int>(col,0));
dp[0][0] = grid[0][0];
for(int i = 1; i < row; i++)
dp[i][0] = dp[i-1][0] + grid[i][0];
for(int i = 1; i < col; i++)
dp[0][i] = dp[0][i-1] + grid[0][i];
for(int i = 1; i < row; i++)
for(int j = 1; j < col; j++)
dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];
return dp[row-1][col-1];
*/
int row = grid.size(), col = grid[0].size();
vector<int> dp(col,0);
dp[0] = grid[0][0];
for(int j = 1; j < col; j++)
dp[j] = dp[j - 1] + grid[0][j];
for(int i = 1; i < row; i++){
dp[0] += grid[i][0];
for(int j = 1; j < col; j++)
dp[j] = min(dp[j - 1],dp[j]) + grid[i][j];
}
return dp[col - 1];
}
-------------------------------------------------------------------
思路 : 动态规划
1 用一个二维数组dp[i][j]记录到达 i,j 所需要的最小路径和。考虑边界条件。
2 优化 :用一个一维数组来记录到达某一列,需要的最小路径和。
代码:
int minPathSum(vector<vector<int>>& grid) {
/*
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
if(col == 0)
return 0;
vector<vector<int>> dp(row,vector<int>(col,0));
dp[0][0] = grid[0][0];
for(int i = 1; i < row; i++)
dp[i][0] = dp[i-1][0] + grid[i][0];
for(int i = 1; i < col; i++)
dp[0][i] = dp[0][i-1] + grid[0][i];
for(int i = 1; i < row; i++)
for(int j = 1; j < col; j++)
dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];
return dp[row-1][col-1];
*/
int row = grid.size(), col = grid[0].size();
vector<int> dp(col,0);
dp[0] = grid[0][0];
for(int j = 1; j < col; j++)
dp[j] = dp[j - 1] + grid[0][j];
for(int i = 1; i < row; i++){
dp[0] += grid[i][0];
for(int j = 1; j < col; j++)
dp[j] = min(dp[j - 1],dp[j]) + grid[i][j];
}
return dp[col - 1];
}
相关文章推荐
- 给定一个充满非负数的网格,找到从左上到右下的路径,最小化沿其路径的所有数字的总和。只能向下或向右移动。
- 给定一个字符串只含有数字,判定这个字符串能表达的所有IP地址
- 给定一个三角形,从顶部到底部找到最小路径和。 每个步骤,您可以移动到下面的行上的相邻数字。
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- 二叉树的每个节点为0-9的一个数字,根到叶子的一条路径拼成一个数,求所有路径形成的数字和
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 判断二叉树,是否存在一条根到叶子的路径和,与一个指定的目标数字相等
- 给定有向图,设计一个算法,找出两个结点之间是否存在一条路径
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)
- 面试题:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
- 【31】给定一个二叉树打印出所有从根结点到叶子结点路径和为 k 的路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- 一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。
- 给定一个排序的链表,删除所有具有重复数字的节点,从原始列表中只留下不同的数字。
- Python实现在给定整数序列中找到和为100的所有数字组合