解答問題:
一座大樓一共有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 ...