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

2021-09-26 16:26:14 字數 1396 閱讀 2403

假設有排成一行的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的方法數對10^9+7109+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)。
base case:當步數為0時,當前位置cur與目標位置p重合,說明這是一種走法,返回1,否則返回0;

1、當位於最左端,只能往右走

2、當位於最右端,只能往左走

3、當位於中間位置,既能往左走,又能往右走

//法1:暴力遞迴

//執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。

//case通過率為0.00%

//vs上 case1:3 1 3 3 --- 0 case2:5 2 3 3 --- 3 都通過

#includeusing namespace std;

const int number=1000000007;

int walk(int& n,int cur,int rest,int& p)

if(cur==1)

if(cur==n)

return (walk(n,cur-1,rest-1,p)+walk(n,cur+1,rest-1,p))%number;

}int main()

if(memo[cur][rest]!=-1)

if(cur==1)

if(cur==n)

memo[cur][rest]=(walk(n,cur-1,rest-1,p)+walk(n,cur+1,rest-1,p))%number;

return memo[cur][rest];

}int main()else if(j==n)else}}

coutconst int number=1000000007;

int main()else if(j==n)else

leftup=tmp;}}

cout

}

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

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

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

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

機械人的定位問題

下面的大部分概念 於 自主移動機械人導論 這本書 信任度表示 機械人必須有乙個在地圖上有關它位置信任度的方法。機械人是否辨識乙個單獨的特定位置作為它的當前位置,或它是否根據一組可能的位置描述它的位置?如果以單個信任度完全表達多個可能位置,那如何將這多個位置排序?這就是信任度表示方法的設計問題 信任度...