題目:機械人達到指定位置方法數
《程式設計師**面試指南》第59題 p192 難度:尉★★☆☆
書上題目順序安排極不合理,這題應該放在上一題的前面。上一題沒做出來,大致看了下解析,對這題有一定啟發,很快想出來了。
主要介紹一下本題提出的「用暴力遞迴解決的方法如何優化成動態規劃」的套路。
首先是暴力遞迴方法:
// n : 位置為1 ~ n,固定引數
// cur : 當前在cur位置,可變引數
// rest : 還剩res步沒有走,可變引數
// p : 最終目標位置是p,固定引數
// 該函式的含義:只能在1~n這些位置上移動,當前在cur位置,走完rest步之後,停在p位置的方法數作為返回值返回
public int walk(int n, int cur, int rest, int p)
// 如果還有rest步要走,而當前的cur位置在1位置上,那麼當前這步只能從1走向2
// 後續的過程就是,來到2位置上,還剩rest-1步要走
if (cur == 1)
// 如果還有rest步要走,而當前的cur位置在n位置上,那麼當前這步只能從n走向n-1
// 後續的過程就是,來到n-1位置上,還剩rest-1步要走
if (cur == n)
// 如果還有rest步要走,而當前的cur位置在中間位置上,那麼當前這步可以走向左,也可以走向右
// 走向左之後,後續的過程就是,來到cur-1位置上,還剩rest-1步要走
// 走向右之後,後續的過程就是,來到cur+1位置上,還剩rest-1步要走
// 走向左、走向右是截然不同的方法,所以總方法數要都算上
return walk(n, cur + 1, rest - 1, p) + walk(n, cur - 1, rest - 1, p);
}public int ways1(int n, int m, int k, int p)
// 總共n個位置,從m點出發,還剩k步,返回最終能達到p的方法數
return walk(n, m, k, p);
}
套路大體步驟如下:
前提:你的嘗試過程是無後效性的。所謂無後效性,是指乙個遞迴狀態的返回值與怎麼到達這個狀態的路徑無關。某個無後效性的遞迴過程(嘗試過程)一旦確定,怎麼優化成動態規劃是有固定套路的。
找到什麼可變引數可以代表乙個遞迴狀態,也就是哪些引數一旦確定,返回值就確定了。
把可變引數的所有組合對映成一張表,有1個可變引數就是一維表,2個可變引數就是二維表……
最終答案要的是表中的哪個位置,在表中標出。
根據遞迴過程的base case,把這張表最簡單、不需要依賴其他位置的那些位置填好值。
根據遞迴過程非base case的部分,也就是分析表中的普遍位置需要怎麼計算得到,那麼這張表的填寫順序也就確定了。
填好表,返回最終答案在表中位置的值。
填寫每乙個位置的值都是o(1)的時間複雜度,所以總的時間複雜度為o(n×k)。
public int ways2(int n, int m, int k, int p)
int dp = new int[k + 1][n + 1];
dp[0][p] = 1;
for (int i = 1; i <= k; i++) else if (j == n) else }}
return dp[k][m];
}
以及動態規劃+空間壓縮的解法:
public int ways3(int n, int m, int k, int p)
int dp = new int[n + 1];
dp[p] = 1;
for (int i = 1; i <= k; i++) else if (j == n) else
leftup = tmp;}}
return dp[m];
}
機械人達到指定位置方法數
假設有排成一行的n個位置,記為1 n,開始時機械人在m位置,機械人可以往左或者往右走,如果機械人在1位置,那麼下一步機械人只能走到2位置,如果機械人在n位置,那麼下一步機械人只能走到n 1位置。規定機械人只能走k步,最終能來到p位置的方法有多少種。由於方案數可能比較大,所以答案需要對1e9 7取模。...
機械人到達指定位置方法數
機械人到達指定位置方法數 假設有排成一行的n個位置,記為1 n,開始時機械人在m位置,機械人可以往左或者往右走,如果機械人在1位置,那麼下一步機械人只能走到2位置,如果機械人在n位置,那麼下一步機械人只能走到n 1位置。規定機械人只能走k步,最終能來到p位置的方法有多少種。由於方案數可能比較大,所以...
機械人的定位問題
下面的大部分概念 於 自主移動機械人導論 這本書 信任度表示 機械人必須有乙個在地圖上有關它位置信任度的方法。機械人是否辨識乙個單獨的特定位置作為它的當前位置,或它是否根據一組可能的位置描述它的位置?如果以單個信任度完全表達多個可能位置,那如何將這多個位置排序?這就是信任度表示方法的設計問題 信任度...