C++怎么實現(xiàn)不同的路徑

今天小編給大家分享一下C++怎么實現(xiàn)不同的路徑的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),外鏈,一元廣告為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

Unique Paths 不同的路徑

A robot is located at the top-left corner of a m x n grid (marked "Start" in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked "Finish" in the diagram below).

How many possible unique paths are there?

C++怎么實現(xiàn)不同的路徑

Above is a 7 x 3 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

Example 1:

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right

Example 2:

Input: m = 7, n = 3
Output: 28

這道題讓求所有不同的路徑的個數(shù),一開始還真把博主難住了,因為之前好像沒有遇到過這類的問題,所以感覺好像有種無從下手的感覺。在網(wǎng)上找攻略之后才恍然大悟,原來這跟之前那道 Climbing Stairs 很類似,那道題是說可以每次能爬一格或兩格,問到達頂部的所有不同爬法的個數(shù)。而這道題是每次可以向下走或者向右走,求到達最右下角的所有不同走法的個數(shù)。那么跟爬梯子問題一樣,需要用動態(tài)規(guī)劃 Dynamic Programming 來解,可以維護一個二維數(shù)組 dp,其中 dp[i][j] 表示到當前位置不同的走法的個數(shù),然后可以得到狀態(tài)轉(zhuǎn)移方程為:  dp[i][j] = dp[i - 1][j] + dp[i][j - 1],這里為了節(jié)省空間,使用一維數(shù)組 dp,一行一行的刷新也可以,代碼如下:

解法一:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<int> dp(n, 1);
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                dp[j] += dp[j - 1]; 
            }
        }
        return dp[n - 1];
    }
};

這道題其實還有另一種很數(shù)學(xué)的解法,實際相當于機器人總共走了 m + n - 2步,其中 m - 1 步向右走,n - 1 步向下走,那么總共不同的方法個數(shù)就相當于在步數(shù)里面 m - 1 和 n - 1 中較小的那個數(shù)的取法,實際上是一道組合數(shù)的問題,寫出代碼如下:

解法二:

class Solution {
public:
    int uniquePaths(int m, int n) {
        double num = 1, denom = 1;
        int small = m > n ? n : m;
        for (int i = 1; i <= small - 1; ++i) {
            num *= m + n - 1 - i;
            denom *= i;
        }
        return (int)(num / denom);
    }
};

以上就是“C++怎么實現(xiàn)不同的路徑”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:C++怎么實現(xiàn)不同的路徑
網(wǎng)頁路徑:http://muchs.cn/article18/iheedp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司網(wǎng)站制作、企業(yè)網(wǎng)站制作、ChatGPT、網(wǎng)站收錄標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化