国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊DP入門(mén)之不同路徑

開(kāi)發(fā) 前端
本文分別給出了深搜,動(dòng)規(guī),數(shù)論三種方法。深搜當(dāng)然是超時(shí)了,順便分析了一下使用深搜的時(shí)間復(fù)雜度,就可以看出為什么超時(shí)了。然后在給出動(dòng)規(guī)的方法,依然是使用動(dòng)規(guī)五部曲,這次我們就要考慮如何正確的初始化了,初始化和遍歷順序其實(shí)也很重要!

一個(gè)機(jī)器人位于一個(gè) m x n 網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為 “Start” )。

機(jī)器人每次只能向下或者向右移動(dòng)一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。

問(wèn)總共有多少條不同的路徑?

示例 1:

  • 輸入:m = 3, n = 7
  • 輸出:28

示例 2:

  • 輸入:m = 2, n = 3
  • 輸出:3

解釋:從左上角開(kāi)始,總共有 3 條路徑可以到達(dá)右下角。

  • 向右 -> 向右 -> 向下
  • 向右 -> 向下 -> 向右
  • 向下 -> 向右 -> 向右

示例 3:

  • 輸入:m = 7, n = 3
  • 輸出:28

示例 4:

  • 輸入:m = 3, n = 3
  • 輸出:6

提示:

  • 1 <= m, n <= 100
  • 題目數(shù)據(jù)保證答案小于等于 2 * 10^9

思路

深搜

這道題目,剛一看最直觀的想法就是用圖論里的深搜,來(lái)枚舉出來(lái)有多少種路徑。

注意題目中說(shuō)機(jī)器人每次只能向下或者向右移動(dòng)一步,那么其實(shí)機(jī)器人走過(guò)的路徑可以抽象為一顆二叉樹(shù),而葉子節(jié)點(diǎn)就是終點(diǎn)!

如圖舉例:

不同路徑

此時(shí)問(wèn)題就可以轉(zhuǎn)化為求二叉樹(shù)葉子節(jié)點(diǎn)的個(gè)數(shù),代碼如下:

  1. class Solution { 
  2. private: 
  3.     int dfs(int i, int j, int m, int n) { 
  4.         if (i > m || j > n) return 0; // 越界了 
  5.         if (i == m && j == n) return 1; // 找到一種方法,相當(dāng)于找到了葉子節(jié)點(diǎn) 
  6.         return dfs(i + 1, j, m, n) + dfs(i, j + 1, m, n); 
  7.     } 
  8. public
  9.     int uniquePaths(int m, int n) { 
  10.         return dfs(1, 1, m, n); 
  11.     } 
  12. }; 

大家如果提交了代碼就會(huì)發(fā)現(xiàn)超時(shí)了!

來(lái)分析一下時(shí)間復(fù)雜度,這個(gè)深搜的算法,其實(shí)就是要遍歷整個(gè)二叉樹(shù)。

這顆樹(shù)的深度其實(shí)就是m+n-1(深度按從1開(kāi)始計(jì)算)。

那二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍歷了整個(gè)滿二叉樹(shù)(其實(shí)沒(méi)有遍歷整個(gè)滿二叉樹(shù),只是近似而已)

所以上面深搜代碼的時(shí)間復(fù)雜度為,可以看出,這是指數(shù)級(jí)別的時(shí)間復(fù)雜度,是非常大的。

動(dòng)態(tài)規(guī)劃

機(jī)器人從(0 , 0) 位置出發(fā),到(m - 1, n - 1)終點(diǎn)。

按照動(dòng)規(guī)五部曲來(lái)分析:

確定dp數(shù)組(dp table)以及下標(biāo)的含義

dp[i][j] :表示從(0 ,0)出發(fā),到(i, j) 有dp[i][j]條不同的路徑。

確定遞推公式

想要求dp[i][j],只能有兩個(gè)方向來(lái)推導(dǎo)出來(lái),即dp[i - 1][j] 和 dp[i][j - 1]。

此時(shí)在回顧一下 dp[i - 1][j] 表示啥,是從(0, 0)的位置到(i - 1, j)有幾條路徑,dp[i][j - 1]同理。

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因?yàn)閐p[i][j]只有這兩個(gè)方向過(guò)來(lái)。

dp數(shù)組的初始化

如何初始化呢,首先dp[i][0]一定都是1,因?yàn)閺?0, 0)的位置到(i, 0)的路徑只有一條,那么dp[0][j]也同理。

所以初始化代碼為:

  1. for (int i = 0; i < m; i++) dp[i][0] = 1; 
  2. for (int j = 0; j < n; j++) dp[0][j] = 1; 

確定遍歷順序

這里要看一下遞歸公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是從其上方和左方推導(dǎo)而來(lái),那么從左到右一層一層遍歷就可以了。

這樣就可以保證推導(dǎo)dp[i][j]的時(shí)候,dp[i - 1][j] 和 dp[i][j - 1]一定是有數(shù)值的。

舉例推導(dǎo)dp數(shù)組

如圖所示:

不同路徑

以上動(dòng)規(guī)五部曲分析完畢,C++代碼如下:

  1. class Solution { 
  2. public
  3.     int uniquePaths(int m, int n) { 
  4.         vector<vector<int>> dp(m, vector<int>(n, 0)); 
  5.         for (int i = 0; i < m; i++) dp[i][0] = 1; 
  6.         for (int j = 0; j < n; j++) dp[0][j] = 1; 
  7.         for (int i = 1; i < m; i++) { 
  8.             for (int j = 1; j < n; j++) { 
  9.                 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; 
  10.             } 
  11.         } 
  12.         return dp[m - 1][n - 1]; 
  13.     } 
  14. }; 

時(shí)間復(fù)雜度:

空間復(fù)雜度:

其實(shí)用一個(gè)一維數(shù)組(也可以理解是滾動(dòng)數(shù)組)就可以了,但是不利于理解,可以優(yōu)化點(diǎn)空間,建議先理解了二維,在理解一維,C++代碼如下:

  1. class Solution { 
  2. public
  3.     int uniquePaths(int m, int n) { 
  4.         vector<int> dp(n); 
  5.         for (int i = 0; i < n; i++) dp[i] = 1; 
  6.         for (int j = 1; j < m; j++) { 
  7.             for (int i = 1; i < n; i++) { 
  8.                 dp[i] += dp[i - 1]; 
  9.             } 
  10.         } 
  11.         return dp[n - 1]; 
  12.     } 
  13. }; 

時(shí)間復(fù)雜度:

空間復(fù)雜度:

數(shù)論方法

在這個(gè)圖中,可以看出一共m,n的話,無(wú)論怎么走,走到終點(diǎn)都需要 m + n - 2 步。

不同路徑

在這m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么時(shí)候向下走。

那么有幾種走法呢?可以轉(zhuǎn)化為,給你m + n - 2個(gè)不同的數(shù),隨便取m - 1個(gè)數(shù),有幾種取法。

那么這就是一個(gè)組合問(wèn)題了。

那么答案,如圖所示:

不同路徑

求組合的時(shí)候,要防止兩個(gè)int相乘溢出! 所以不能把算式的分子都算出來(lái),分母都算出來(lái)再做除法。

例如如下代碼是不行的。

  1. class Solution { 
  2. public
  3.     int uniquePaths(int m, int n) { 
  4.         int numerator = 1, denominator = 1; 
  5.         int count = m - 1; 
  6.         int t = m + n - 2; 
  7.         while (count--) numerator *= (t--); // 計(jì)算分子,此時(shí)分子就會(huì)溢出 
  8.         for (int i = 1; i <= m - 1; i++) denominator *= i; // 計(jì)算分母 
  9.         return numerator / denominator; 
  10.     } 
  11. }; 

需要在計(jì)算分子的時(shí)候,不斷除以分母,代碼如下:

  1. class Solution { 
  2. public
  3.     int uniquePaths(int m, int n) { 
  4.         long long numerator = 1; // 分子 
  5.         int denominator = m - 1; // 分母 
  6.         int count = m - 1; 
  7.         int t = m + n - 2; 
  8.         while (count--) { 
  9.             numerator *= (t--); 
  10.             while (denominator != 0 && numerator % denominator == 0) { 
  11.                 numerator /= denominator; 
  12.                 denominator--; 
  13.             } 
  14.         } 
  15.         return numerator; 
  16.     } 
  17. }; 

時(shí)間復(fù)雜度:

空間復(fù)雜度:

計(jì)算組合問(wèn)題的代碼還是有難度的,特別是處理溢出的情況!

總結(jié)

本文分別給出了深搜,動(dòng)規(guī),數(shù)論三種方法。

深搜當(dāng)然是超時(shí)了,順便分析了一下使用深搜的時(shí)間復(fù)雜度,就可以看出為什么超時(shí)了。

然后在給出動(dòng)規(guī)的方法,依然是使用動(dòng)規(guī)五部曲,這次我們就要考慮如何正確的初始化了,初始化和遍歷順序其實(shí)也很重要!

 

責(zé)任編輯:武曉燕 來(lái)源: 代碼隨想錄
相關(guān)推薦

2022-01-10 11:28:55

數(shù)據(jù)結(jié)構(gòu)算法DP入門(mén)

2021-09-30 11:55:00

微服務(wù)

2022-01-11 10:01:25

二叉搜索樹(shù)數(shù)量

2010-06-10 15:36:23

路由協(xié)議的分類

2021-12-28 07:20:44

斐波那契數(shù)算法數(shù)字

2021-05-07 08:02:53

Sentinel 流量服務(wù)

2023-06-05 12:59:03

2021-09-30 09:58:14

路徑總和二叉樹(shù)

2021-12-29 11:32:38

數(shù)據(jù)結(jié)構(gòu)算法爬樓梯

2009-12-31 10:03:58

VPN配置實(shí)例

2021-07-11 12:12:49

.NETJWTjson

2021-09-01 22:58:22

Canvas標(biāo)簽

2024-09-04 09:18:03

分區(qū)策略

2022-12-28 08:16:16

metric聚合java

2020-05-27 08:05:33

MybatisMapper接口

2021-06-08 09:28:12

.Net通知服務(wù)

2022-03-02 07:52:13

React類組件函數(shù)式組件

2009-12-21 15:04:02

路由器配置

2016-11-28 08:40:17

系統(tǒng)降級(jí)服務(wù)

2016-11-25 00:45:37

隊(duì)列數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

99精品国产在热久久下载| 日韩精品成人一区二区在线观看| 亚洲精品中字| 久久香蕉网站| 精品视频免费在线| 亚洲图片都市激情| 中文字幕亚洲在线观看| 欧美高清视频www夜色资源网| 亚洲第一页在线视频| 日本欧美电影在线观看| 26uuu色噜噜精品一区二区| 九九热这里只有精品6| 两个人hd高清在线观看| 极品美女销魂一区二区三区免费| 成人h视频在线| 欧美电影完整版在线观看| 7777精品久久久大香线蕉| 天堂网在线免费观看| 手机看片1024久久| 欧美激情图区| 国产一区二区三区四区五区美女| 国产精品av免费在线观看| 日本一区二区乱| 欧美一级片免费看| 激情在线视频播放| 日韩精品亚洲元码| 卡通欧美亚洲| 久热99视频在线观看| 欧美日韩视频免费观看| 中文字幕日韩高清| 巨人精品**| 亚洲一区二区三区香蕉 | 国产理论在线播放| 国产亚洲一区二区三区| 97成人在线观看视频| 精品不卡一区| 日本免费一区二区三区视频观看 | 日韩欧美亚洲在线| 国产精品久久久久久久免费软件| 亚洲自拍偷拍网址| 欧美伊人影院| 91精品国产乱码久久久久久蜜臀| 可以在线观看的av| 欧美猛男超大videosgay| 婷婷色在线资源| 欧美亚洲自拍偷拍| 黄色网址在线播放| 亚洲色图综合网| 一个人www视频在线免费观看| 亚洲福利在线看| 91精品尤物| 国产免费一区二区| 蜜臀av免费一区二区三区| 精品裸体舞一区二区三区| 91.xxx.高清在线| 日韩精品一二三四区| 亚洲人成网站77777在线观看| 亚洲国产日韩美| 国产精品丝袜在线| 三级中文字幕在线观看| 成人激情黄色网| 国产精品少妇自拍| 黄色在线观看网| 日韩在线一区二区三区免费视频| 粉嫩的18在线观看极品精品| 国产精品一国产精品最新章节| 国产精品日产欧美久久久久| 欧美极品免费| 欧美精品久久| 亚洲人成久久| 依依成人综合视频| 在线观看日韩羞羞视频| 国产精品福利一区二区| 免费亚洲电影| 欧亚精品中文字幕| 国产精品一二三区在线| 国产精品一区二区免费在线观看| 日韩欧美精品网站| 年轻的保姆91精品| 久久福利一区二区| 日韩午夜av一区| 日本aⅴ亚洲精品中文乱码| 色成人亚洲网| 91精品国产91久久久久久久久| 亚洲免费看黄网站| 国产九色porny| 久久综合99| 亚洲天堂网站在线观看视频| 欧美色图另类小说| 国产精选一区二区三区| 亚洲视频小说| 国产精品网址在线| 成人区精品一区二区| 中文字幕成人一区| 国产二级片在线| 熟女少妇在线视频播放| 日韩av网站在线| www.成人在线| 污视频在线免费观看网站| 成年丰满熟妇午夜免费视频| 国产精品av电影| 精品美女国产在线| 亚洲欧美韩国| 可播放的18gay1069| 国产精品视频网| 日韩欧亚中文在线| 精品丝袜在线| 99热成人精品热久久66| 色婷婷国产精品| 日韩脚交footjobhd| 日韩在线免费观看视频| 国产欧美日韩在线观看视频| 免费黄色片在线观看| 色99中文字幕| 奇门遁甲1982国语版免费观看高清| 在线观看成人小视频| 中文字幕一区二区三区四区五区| 天天综合色天天| 亚洲综合成人在线视频| 欧美日韩国产综合一区二区| 亚洲国产成人精品久久| 色综合伊人色综合网| 成人天堂噜噜噜| 国产一区二区三区四区hd| 亚洲综合第一| 日本一二区视频| 污视频网站在线免费| 欧美电影院免费观看| 欧美日韩一区二区国产| 国产毛片精品一区| 亚洲影院在线观看| 欧美精品日韩综合在线| 日韩一区二区三区免费看| 亚洲无线码在线一区观看| 欧美激情免费看| 欧美日韩精品免费观看视一区二区 | 欧美成人激情| 欧美激情黑人| 午夜免费性福利| 无人视频在线观看免费| 污视频网站在线看| 九九热视频在线观看| 黄页网站在线播放| 成人在线观看一区| 午夜不卡视频| 欧美影视资讯| 日韩一级电影| 亚洲欧美伊人| 免费成人在线网站| 欧美激情自拍偷拍| 亚洲大型综合色站| 欧美一区二区三区视频在线| 色偷偷一区二区三区| 精品视频一区二区三区免费| 欧美一区二区成人6969| 精品国产乱码久久久久久闺蜜| 国产视频久久久久久久| 精品国产成人在线| 91网址在线看| 内射国产内射夫妻免费频道| 日韩h在线观看| 免费观看成人av| 99thz桃花论族在线播放| 免费在线观看91| 91免费观看在线| 久久伊人亚洲| 日韩在线麻豆| 黄色大片在线免费观看| 国产精品第七影院| 99视频精品免费视频| 影音先锋一区| www.爱色av.com| 久久久国产91| 国产精品视频一区二区三区不卡| 在线精品国产亚洲| www 四虎| 999视频在线免费观看| 91精品国模一区二区三区| 日韩av电影天堂| 久久91导航| 我要看一级黄色大片| 国产精品久久久久久久美男| 在线一区二区三区四区| 麻豆91精品| 深夜日韩欧美| 特黄特色大片免费视频大全| 粉嫩av免费一区二区三区| 欧美本精品男人aⅴ天堂| 欧美视频在线免费看| 成人午夜亚洲| 国产美女av| 3d蒂法精品啪啪一区二区免费| 欧美日韩国产精品自在自线| 国内久久婷婷综合| 99re8这里有精品热视频8在线 | 欧美黄色一级| 一级视频在线观看视频在线啦啦| 区一区二区三区中文字幕| 日韩中文字幕在线精品| 亚洲一区二区综合|