Minimum Path Sum

来源:互联网 发布:论文数据造假查不出来 编辑:程序博客网 时间:2024/05/19 04:28

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right whichminimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.


题目解析:

(1)A[m][n] = min(A[m-1][n]+grid[m][n] , A[m][n-1]+grid[m][n] ) 递归子结构

(2)单存的递归,显然时间是会超时的。因此我们使用备忘录的方式。


#include <iostream>#include <vector>using namespace std;int recursionPathSum(int **A,vector<vector<int> > &grid,int m,int n);int minPathSum(vector<vector<int> > &grid) {int m = grid.size();int n = grid[0].size();int **A = (int **)malloc(sizeof(int *)*m);for(int i=0;i<m;i++){A[i] = (int *)malloc(sizeof(int)*n);for(int j=0;j<n;j++){A[i][j] = -1;}}A[0][0] = grid[0][0];return recursionPathSum(A,grid,m-1,n-1);}int recursionPathSum(int **A,vector<vector<int> > &grid,int m,int n){if(A[m][n] != -1)return A[m][n];int result = 0;if(m == 0){for(int i=0;i<=n;i++){result = result + grid[m][i];}A[0][n] = result;return result;}if (n == 0){for(int i=0;i<=m;i++){result += grid[i][n];}A[m][0] = result;return result;}int res = min(recursionPathSum(A,grid,m-1,n)+grid[m][n],recursionPathSum(A,grid,m,n-1)+grid[m][n]);A[m][n] = res;return res;}int main(void){vector<vector<int> > grid;vector<int> temp1;temp1.push_back(1);temp1.push_back(2);grid.push_back(temp1);vector<int> temp2;temp2.push_back(3);temp2.push_back(4);grid.push_back(temp2);vector<int> temp3;temp3.push_back(5);temp3.push_back(6);grid.push_back(temp3);cout << minPathSum(grid) << endl;system("pause");return 0;}


0 0
原创粉丝点击