#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//时间复杂度M*N,空间复杂度M*N
int minPathSum1(vector<vector<int> > & m)
{
if(m.size() == 0 || m[0].size() == 0)
return 0;
int row = m.size();
int col = m[0].size();
vector<vector<int> > dp(row, vector<int>(col, 0));
dp[0][0] = m[0][0];
for(int i = 1; i < col; ++i)
dp[0][i] = dp[0][i - 1] + m[0][i];
for(int i = 1; i < row; ++i)
dp[i][0] = dp[i - 1][0] + m[i][0];
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]) + m[i][j];
return dp[row - 1][col - 1];
}
//时间复杂度M*N,空间复杂度min(M,N)
int minPathSum2(vector<vector<int> > &m)
{
if(m.size() == 0 || m[0].size() == 0)
return 0;
int more = max(m.size(), m[0].size());
int less = more == m.size() ? m[0].size() : m.size();
bool rowmore = more == m.size();//行数是否大于等于列数
vector<int> arr(less);
arr[0] = m[0][0];
for(int i = 1; i < less; ++i)
arr[i] = arr[i - 1] + (rowmore ? m[0][i] : m[i][0]);
for(int i = 1; i < more; ++i)
{
arr[0] = arr[0] + (rowmore ? m[i][0] : m[0][i]);
for(int j = 1; j < less; ++j)
arr[j] = min(arr[j - 1], arr[j]) + (rowmore ? m[i][j] : m[j][i]);
}
return arr[less - 1];
}
int main()
{
vector<vector<int> > res;
vector<int> tmp;
tmp.push_back(1);
tmp.push_back(4);
tmp.push_back(9);
tmp.push_back(18);
res.push_back(tmp);
tmp[0] = 9;
tmp[1] = 5;
tmp[2] = 8;
tmp[3] = 12;
res.push_back(tmp);
tmp[0] = 14;
tmp[1] = 5;
tmp[2] = 11;
tmp[3] = 12;
res.push_back(tmp);
tmp[0] = 22;
tmp[1] = 12;
tmp[2] = 15;
tmp[3] = 12;
res.push_back(tmp);
cout << minPathSum1(res) << endl;
cout << minPathSum2(res) << endl;
}
矩阵的最小路径和
猜你喜欢
转载自blog.csdn.net/wzc2608/article/details/80890000
今日推荐
周排行