矩阵的最小路径和

#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