機械人到達指定位置方法數

2021-10-10 17:21:40 字數 2252 閱讀 7416

機械人到達指定位置方法數

假設有排成一行的n個位置,記為1~n,開始時機械人在m位置,機械人可以往左或者往右走,如果機械人在1位置,那麼下一步機械人只能走到2位置,如果機械人在n位置,那麼下一步機械人只能走到n-1位置。規定機械人只能走k步,最終能來到p位置的方法有多少種。由於方案數可能比較大,所以答案需要對1e9+7取模。

輸入描述:

輸出包括一行四個正整數n(2<=n<=5000)、m(1<=m<=n)、k(1<=k<=5000)、p(1<=p<=n)。

輸出描述:

輸出乙個整數,代表最終走到p的方法數對109

+7

10^9+7

109+

7取模後的值。

示例1輸入

5 2 3 3
輸出
3
說明
1).2->1,1->2,2->3

2).2->3,3->2,2->3

3).2->3,3->4,4->3

示例2

輸入

1000 1 1000 1
輸出
591137401
說明
注意答案要取模
備註:

時間複雜度o(n

∗k

)o(n*k)

o(n∗k)

,空間複雜度o(n

)o(n)

o(n)

。題解:

動態規劃,設 f[i

][j]

f[i][j]

f[i][j

] 表示走了 i 步,在 j 位置的方案數,分情況討論:

因為初始在 m 位置,將 f[0

][m]

f[0][m]

f[0][m

] 設為 1,最終的結果就是 f[k

][p]

f[k][p]

f[k][p

] 。**:

#include

#include

using

namespace std;

const

int mod =

1e9+7;

const

int n =

5001

;int n, m, k, p;

int f[n]

[n];

intmain

(void)}

return0*

printf

("%d\n"

, f[k]

[p])

;}

優化一:

我們發現,轉移方程中,只跟 f[i-1] 有關,我們可以使用乙個輔助陣列 h 來記錄 f 的上一層狀態,狀態轉移時,直接使用上一層的狀態即可。

優化一**:

#include

#include

using

namespace std;

const

int mod =

1e9+7;

const

int n =

5001

;int n, m, k, p;

int f[n]

;int h[n]

;int

main

(void

)memcpy

( h, f,

sizeof f );}

return0*

printf

("%d\n"

, f[p]);

}

優化二:

觀察狀態轉移方程,如果只用乙個陣列 f ,在 j 位置時,因為 f[j + 1] 儲存的還是上一層的狀態,可以直接使用,但是 f[j - 1] 已經被修改了,怎麼辦呢?我們可以設定乙個臨時變數提前儲存 f[j - 1] 就行了。

優化二**:

#include

#include

using

namespace std;

const

int mod =

1e9+7;

const

int n =

5001

;int n, m, k, p;

int f[n]

;int

main

(void)}

return0*

printf

("%d\n"

, f[p]);

}

機械人達到指定位置方法數

假設有排成一行的n個位置,記為1 n,開始時機械人在m位置,機械人可以往左或者往右走,如果機械人在1位置,那麼下一步機械人只能走到2位置,如果機械人在n位置,那麼下一步機械人只能走到n 1位置。規定機械人只能走k步,最終能來到p位置的方法有多少種。由於方案數可能比較大,所以答案需要對1e9 7取模。...

機械人達到指定位置方法數

題目 機械人達到指定位置方法數 程式設計師 面試指南 第59題 p192 難度 尉 書上題目順序安排極不合理,這題應該放在上一題的前面。上一題沒做出來,大致看了下解析,對這題有一定啟發,很快想出來了。主要介紹一下本題提出的 用暴力遞迴解決的方法如何優化成動態規劃 的套路。首先是暴力遞迴方法 n 位置...

js scrollTop到達指定位置!

很早之前就想分享這篇心得,幸之今天能在這裡完成,好了,話不多說,進入正題 方法主要利用scrolltop值做運動,用於到達使用者指定的位置 如返回頂部把引數target設定為0即可 處理了多種情況如 scrolltop 目標值 向上運動 等4種情況 及用法貼上,goto function targe...