题目:
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.
思路:
这是一个典型的动态规划,我们需要一个变量记录,dp[i][j]表示到达{i,j}的最短距离,如果不考虑边界处理的话,那么dp[i][j] = min(dp[i][j], min(vec[i][j]+dp[i][j-1],vec[i][j]+dp[i-1][j]))
然后在初始化时再考虑一下边界处理。
#include <iostream>
#include <string>
#include <vector>
#include <limits>
using namespace std;
/*
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.
*/
/*
格子取数
*/
int MinPahtSum(vector<vector<int> >& vec)
{
vector<vector<int> > dp(vec.size());
int i,j;
for(i=0;i<vec.size();i++)
dp[i].assign(vec[i].size(),numeric_limits<int>::max());
dp[0][0] = vec[0][0];
for(i=1;i<vec.size();i++)
dp[i][0] = vec[i][0]+dp[i-1][0];
for(j=1;j<vec[0].size();j++)
dp[0][j] = vec[0][j] + dp[0][j-1];
int tmp;
for(i=1;i<vec.size();i++)
{
for(j=1;j<vec[0].size();j++)
{
tmp = min(vec[i][j]+dp[i][j-1],vec[i][j]+dp[i-1][j]);
dp[i][j] = min(dp[i][j],tmp);
}
}
return dp[vec.size()-1][vec[0].size()-1];
}
int main()
{
vector<vector<int> > vec(3);
int i,j;
int array[]={2,4,3,7};
int array1[]={5,3,2,1};
int array2[]={4,8,6,2};
vec[0].assign(array,array+4);
vec[1].assign(array1,array1+4);
vec[2].assign(array2,array2+4);
cout<<MinPahtSum(vec)<<endl;
return 0;
}