演算法問題 丟棋子的動態規劃問題

2021-10-10 00:27:01 字數 1698 閱讀 1484

解答問題:

一座大樓一共有0~n層,地面算第0層,最高一層為第n層。已知棋子從第0層掉落肯定不會摔碎,從第i層掉落可能回摔碎,也可能不會摔碎(1<=i<=n)。給定整數n作為樓層數,再給定整數k作為棋子數,返回如果想找到棋子不會摔碎的最高層數,即使在最差的情況下仍的最少次數。一次只能仍乙個棋子。

n=10, k=1.

返回10。因為只有1顆棋子,所以不得不從第一層開始一直試到第十層,最差情況要扔10次。

n=3, k=2.

返回2。現在第2層仍1顆棋子,如果碎了,試第1層;如果沒碎,試第3層。

n=105, k=2.

返回14。

第一顆棋子嘗試層數

若第一顆碎了第二顆棋子嘗試的層數

第一次嘗試

141~13

第一次沒碎

2715~26

第二次沒碎

3928~38

第三次沒碎

5040~49

第四次沒碎

6051~59

第五次沒碎

6961~68

第六次沒碎

7770~76

第七次沒碎

8478~83

第八次沒碎

9085~89

第九次沒碎

9591~94

第十次沒碎

9996~98

第十一次沒碎

102100,101

第十二次沒碎

104103

第十三次沒碎

105設p(n,k)的返回值時n層樓時有k個棋子在最差的情況下仍的最少次數。

如果n==0,棋子在第0層肯定不會碎,所以p(0, k) = 0;

如果k==1,樓層有n層,只有1個棋子,故只能從第一次開始嘗試,p(n,1)=n;

對於n>0且k>1, 我們需考慮第1個棋子是從那層開始仍的。如果第1個棋子從第i層開始仍,那麼有以下兩種情況:

(1) 碎了。沒必要嘗試第i層以上的樓層了,接下來的問題就變成了剩下i-1層樓和k-1個棋子,所以總步數為 1+p(i-1, k-1);

(2)沒碎。 那麼可以知道沒必要嘗試第i層及其以下的樓層了,接下來的問題就變成了還剩下n-i層和k個棋子,所以總步數為 1+p(n-i, k).

根據題意應該選取(1)和(2)中較差的那種情況,即 max+1。 由於i的取值範圍是 1到n, 那麼步數最少的情況為, p(n, k)=min(1<=i<=n) }+1。

public int solutionone(int n, int k)

private int helper1(int n, int k)

return min+1;

}

通過研究以上遞迴函式發現, p(n, k)過程依賴於p(0...n-1, k-1) 和 p(0...n-1, k)。所以,若把所有的遞迴的返回值看作是乙個二維陣列,可以用動態規劃的方法優化遞迴過程。從而減少計算量。

dp[0][k] = 0, dp[n][1] = n, dp[n][k] = min( max(dp[i-1][k-1], dp[n-i][k])) + 1。

public int solutiontwo(int n, int k)

int dp = new int[k];

int res = 0;

while (true) }}

}private int log2n(int n)

丟棋子問題2020 12 3

題目描述 一座大樓有層,地面算作第0層,最高的一層為第 層。已知棋子從第0層掉落肯定不會摔碎,從第層掉落可能會摔碎,也可能不會摔碎。給定整數作為樓層數,再給定整數作為棋子數,返回如果想找到棋子不會摔碎的最高層數,即使在最差的情況下扔的最小次數。一次只能扔乙個棋子。示例1輸入 10,1 返回值10 說...

演算法 動態規劃問題

一 什麼是動態規劃?動態規劃 dynamic programming 是 運籌學的乙個分支,是求解決策過程 decision process 最優化的數學方法。20世紀50年代初 美國數學家r.e.bellman等人在研究多階段決策過程 multistep decision process 的優化問...

演算法 硬幣問題(動態規劃)

name 硬幣問題 動態規劃 actor ht time 2015年7月20日 error reporte 1.不能得到答案時的限定。該題目中初始化,以及每次迴圈初形態要注意判斷 include stdio.h include conio.h include string.h define n 5 ...