Minimum Path Sum [LeetCode]
2013-11-21 15:08
253 查看
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Summary: DP, calucate the minimun sum from start point to every cell unitil we traverse every cell, then just output the last cell.
Note: You can only move either down or right at any point in time.
Summary: DP, calucate the minimun sum from start point to every cell unitil we traverse every cell, then just output the last cell.
void goRight(int row_index, int column_index, int **grid_sum, vector<vector<int> > &grid) { column_index ++ ; int sum = grid_sum[row_index][column_index - 1] + grid[row_index][column_index]; if(grid_sum[row_index][column_index] == -1 || sum < grid_sum[row_index][column_index]) grid_sum[row_index][column_index] = sum; } void goDown(int row_index, int column_index, int **grid_sum, vector<vector<int> > &grid ) { row_index ++; int sum = grid_sum[row_index -1][column_index] + grid[row_index][column_index]; if(grid_sum[row_index][column_index] == -1 || sum < grid_sum[row_index][column_index]) grid_sum[row_index][column_index] = sum; } int minPathSum(vector<vector<int> > &grid) { if( grid.size() <= 0 || grid[0].size() <=0){ return 0; }else if ( grid.size() == 1){ int sum = 0; for (auto item : grid[0]) sum += item; return sum; }else if (grid.size() > 1 && grid[0].size() == 1) { int sum = 0 ; for ( auto item : grid) sum += item[0]; return sum; }else { int row_size = grid.size(); int column_size = grid[0].size(); int ** grid_sum = new int *[row_size]; for( int i=0; i< row_size; i++ ) { grid_sum[i] = new int [column_size] ; } for(int i =0 ; i< row_size; i ++){ for(int j =0; j < column_size; j++) grid_sum[i][j] = -1; } for(int i = 0; i <= (row_size -1 + column_size -1); i++) { if (i == 0) { int row_index = 0; int column_index = 0; grid_sum[0][0] = grid[0][0]; if(row_index + 1 < row_size) goDown(row_index, column_index, grid_sum, grid); if(column_index + 1 < column_size) goRight(row_index, column_index, grid_sum, grid); }else { int row_index = 0; int column_index = 0; for(row_index = 0; row_index <= i; row_index ++ ){ if(row_index >= row_size ) continue; column_index = i - row_index; if(column_index >= column_size) continue; if(row_index + 1 < row_size) goDown(row_index, column_index, grid_sum, grid); if(column_index + 1 < column_size) goRight(row_index, column_index, grid_sum, grid); } } } int sum = grid_sum[row_size - 1][column_size - 1]; for( int i=0; i< row_size; i++ ) { delete [] grid_sum[i]; } delete grid_sum; return sum; } }
相关文章推荐
- JS两种定义方式的区别、内部原理
- android log 过滤以及其他技巧
- MongoDB命令及SQL语法对比
- SQL Server 中关于EXCEPT和INTERSECT的用法
- 美国有多少辆汽车? 05年毕业生经典面试题
- Visual Studio 2008提高工作效率的小技巧
- 黑马程序员:交通灯管理系统分析及代码实现
- vi编辑器的常见使用技巧
- 雷达方程
- Hessian介绍
- MongoDB 数据分页和排序 limit,skip,sort用户
- POJ2369 置换群
- 产品新人如何入门,从需求分析开始!
- 指尖检测算法
- 字符串四则运算求值
- MySQL-关于事务的使用
- C++ 对象的内存布局
- utils-求小数方法(java)
- 面试智力题(含答案)
- 刘东明老师中国邮政储蓄银行互联网金融网络营销培训