矩陣從左上角向右下角走,每次只能向右或者向下移動,求經過最小的路徑


先通過動態規划求出最小路徑的值,然后根據dp二維數組倒推所走路徑。參考找出最大公共子序列解法。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int minsum(vector<vector<int>>a, vector<int>&reg){
    vector<vector<int>>dp(a.size(), vector<int>(a[0].size(), a[0][0]));
    
    for (int i = 1; i < a.size(); i++){
        dp[i][0] = dp[i - 1][0]+a[i][0];
    }
    for (int j = 1; j < a[0].size(); j++){
        dp[0][j] = dp[0][j - 1] + a[0][j];
    }
    for (int i = 1; i < a.size(); i++){
        for (int j = 1; j < a[0].size(); j++){
            dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
        }
    }
    /*for (int i = 0; i < dp.size(); i++){
        for (int j = 0; j < dp[0].size(); j++){
            cout << dp[i][j] << " ";
        }
        cout << endl;
    }*/
    
    int i = dp.size() - 1;
    int j = dp[0].size() - 1;
    while (i >= 0 && j >= 0){
        reg.push_back(a[i][j]);
        if (i > 0 && j > 0){
            if (dp[i][j - 1] > dp[i - 1][j]){
                i--;
            }
            else{
                j--;
            }
            continue;
        }
        else if (i == 0){
            j--;
        }
        else{
            i--;
        }
    }
    return dp[a.size()-1][a[0].size()-1];
}

int main(){
    vector<vector<int>>a = { { 1, 3, 1 }, { 1, 5, 1 }, { 4, 2, 1 } };
    vector<int>reg;
    int res = minsum(a,reg);
reverse(reg.begin(), reg.end());
for (int i = 0; i < reg.size(); i++){ cout << reg[i] << endl; } system("pause"); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 最短路徑(給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。) Leetcode練習(Python):數組類:第64題:給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 不同路徑II(一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。) Leetcode練習(Python):數組類:第63題:一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑? 不同路徑(一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 問總共有多少條不同的路徑?) Leetcode練習(Python) :數組類:第62題:一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 問總共有多少條不同的路徑? 從棋盤左上角到右下角共有多少種走法 一個n*n 的方格,要從左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走動的方法數。 【排列組合】給定一個M*N的格子或棋盤,從左下角走到右上角的走法總數(每次只能向右或向上移動一個方格邊長的距離) 我的border能自定義四角之border-radius : 左上角,右上角,左下角,右下角。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM