從矩陣左上角至右下角(無權值)問題

2021-09-30 09:13:36 字數 1313 閱讀 6529

問題**

來自於euler project的第十五個題目,題目不複雜,但是可以有很多種思路和解法。此外,我宿舍一姐們面試剛好碰到此題。題目鏈結

問題描述

乙個 m*n 的矩陣,從矩陣的左上角到矩陣的右下角,只能向右走或者向下走,有多少種解法?

例如乙個2*2的矩陣,有下面六種解法。

問題解法

假設矩陣有m行n列。

1、數學解法

使用排列組合有兩種思路。因為只能向右走或者向下走。

(1)在m+n次行走後,才能到達終點,也就是右下角,而在這m+n次行走中,有m次是向下,n次向右。所以是乙個選擇問題。

對於euler這題而言,就是c(40, 20),在google中輸入40 choose 20,答案就出來啦。

(2)水平行走記作0,豎直行走記作1。每一種行走足跡可以作為乙個0,1串,其中n個0,m個1。可以看做0000000000000(n個0)1111111111111(m個1)的重排列。

也就是如果實在想不出公式,可以寫出前面一些特殊的然後找規律,這也是沒有辦法的辦法了,但是不一定有效。

2、遞迴解法。

遞迴,動態規劃,說白了,就是把乙個問題分解成子問題,然後找出最小子問題。動態規劃還需要找出問題的求解順序。

因此,我們發現了這個問題的遞迴式:

matrix[i][j]=matrix[i-1][j] + matrix[i][j-1]

以及初始條件:matrix[i][0]=matrix[0][j]=1

#include #include #include __int64 digui(int row, int col)

int main()

但是,遞迴因為不記錄中間結果,會重複計算很多中間值,超級費時!

比如這個程式在我的pc上跑,16*16的時候,需要3.727000秒。而17*17規模,需要13.601000秒,當問題規模到18*18時候計算時間已經到了52.803000秒了,基本到21*21是很慢很慢的了。

3、動態規劃解法

和遞迴的原理差不多,需要多注意乙個問題就是計算順序的問題。這個題就按順序一行一行掃瞄就行了。

#include#define xmax 21

#define ymax 21

int main() {

__int64 matrix[xmax][ymax];

for(int i=0;i

3左上角右上角動態規劃

穿過幽谷意味著離大魔王lemon已經無限接近了!可誰能想到,yifenfei在斬殺了一些蝦兵蟹將後,卻再次面臨命運大迷宮的考驗,這是魔王lemon設下的又乙個機關。要知道,不論何人,若在迷宮中被困1小時以上,則必死無疑!可憐的yifenfei為了去救mm,義無返顧地跳進了迷宮。讓我們一起幫幫執著的他...

CSS td 右下角 左上角顯示

table td左對齊 右對齊title type text css main tb main tb td td 文字顯示左上角 main tb td explainleft main tb td explainleft div main tb td explainleft input td 文字顯...

ubuntu自定義桌面左上角「Ubuntu 桌面」

建立檔案user.po,檔案內容如下 msgid ubuntu desktop msgstr jasper s desktop jasper s desktop就是你要修改的文字 在user.po同目錄下建立startshell.sh,檔案內容如下 獲取當前路徑 cur dir pwd echo 當...