機械人到達指定位置方法數
假設有排成一行的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...