51nod 1118 機械人走方格 動態規劃

2022-06-13 22:06:07 字數 2879 閱讀 1744

m * n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10^9 + 7的結果。

input

第1行,2個數m,n,中間用空格隔開。(2 <= m,n <= 1000)

output

輸出走法的數量。

input示例

2 3

output示例

3

這個題目可以遞迴來求解,首先,我們需要乙個·遞推公式

對於矩陣中的格仔(i,j),假設cong(1,1)到它的路徑數量為path(i,j)

那麼,有:path(i,j)=path(i-1,j)+path(i,j-1)

很好理解,機械人只能向下或者向右運動,因此它只能是從(i-1,j)或者(i,j-1)

運動到(i,j)的,所以路徑數量也就是到達這兩個格仔的路徑之和

我們需要乙個初始條件,當僅有一行或者一列時,無論怎麼走也只有一條路

1

ll path(llm lln)

完整**如下:

1 #include 2 #include 3 #include 

4 #include 5

const

int max = 1010;6

const

int mod = 1000000007;7

using

namespace

std;

8long

long

dp[max][max];

9int

main()

1023 }

第二種解法

從純數學角度,本人覺得反而更好理解,簡單的排列組合,機械人

從(1,1)走到(m,n)一定要向下走m-1次,向右走n-1次,因此,一共可能的

路徑數量就是從總的步數(m-1+n-1)裡取(m-1)步

c(m-1+n-1,m-1)=(m-1+n-1)!/((m-1)!*(n-1)!) //翻數學公式

1

ll fact (ll n )

5ll path(llm ,lln)

變題:如果有一些格仔,機械人不能踏上去(放了地雷xd),那麼

我們如何輸出它所有的可能路徑

讓我們考慮簡單一點的問題,如果我們只要輸出它其中的一條可行

的路徑,那麼我們可以從終點(m,n)開始回溯,遇到可走的格仔

就入棧,如果沒有格仔能到達當前格仔,當前格仔則出棧,最後到達

(1,1)時,棧中正好儲存了一條可行的路徑

1

bool get_path(int m,int

n)

其中二維陣列g表示的是m*n的矩陣,元素為1表示該位置可以走

為0表示該位置不可以走,這個只能得到其中的一條可行的路徑

但是題目要求我們找到所有可行路徑,並輸出。這樣的話,又該

怎麼辦呢?我們從(1,1)開始,如果某個格仔可以走,我們就將

它儲存到路徑陣列中,如果不能走,則回溯到上乙個格仔,繼續

選擇向右或者向下走,當機械人走到右下角的格仔(m,n)時,即

可輸出一條路徑,然後程式退出遞迴,回到上乙個格仔,找尋下

一條可行路徑

1

void print_paths(int m,int n,int m,int n,int

len)

10else

14 }

程式使用的輸入樣例8.2.in如下:

3 41 1 1 0

0 1 1 1

1 1 1 1

輸出路徑如下:

one of tne paths:

(1,1) (1,2) (1,3) (2,3) (2,4) (3,4)

all paths:

(1,1) (1,2) (1,3) (2,3) (2,4) (3,4)

(1,1) (1,2) (1,3) (2,3) (3,3) (3,4)

(1,1) (1,2) (2,2) (2,3) (2,4) (3,4)

(1,1) (1,2) (2,2) (2,3) (3,3) (3,4)

(1,1) (1,2) (2,2) (3,2) (3,3) (3,4)

完整**如下:

1 #include 2 #include 3 #include 4

using

namespace

std;

5 typedef long

long

ll;6 typedef struct

pointpoint;

9 stacksp;

10const

int maxn=20;11

intg[maxn][maxn];

12 point vp[maxn+maxn];

1314

ll path(llm,lln)

1819

ll path1(llm lln)

22bool get_path(int m,int

n)34

void print_paths(int m,int n,int m,int n,int

len)

43else47}

48int

main()

68 cout<"

all paths:

"<69 print_paths(1,1,m,n,0

);70

fclose(stdin);

71return0;

7273 }

51nod 1118 機械人走方格

m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。第1行,2個數m,n,中間用空格隔開。2 m,n 1000 輸出走法的數量。2 3第一次看到覺得用搜尋寫,沒寫出來,但是還是覺得搜素可以實現的 下面用的是dp,等...

51nod 1118 機械人走方格

基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。input 第1行,2個數m,n,中間用空格隔開。2 m,n 1000 output ...

51nod 1118 機械人走方格

1118 機械人走方格 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏關注m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。input 第1行,2個數m,n,中間用空格隔開。2 ...