雞蛋掉落/玻璃球與樓層高度 動態規劃

*題目:

你將獲得 K 個雞蛋,並可以使用一棟從 1 到 N 共有 N 層樓的建築。
每個蛋的功能都是一樣的,如果一個蛋碎了,你就不能再把它掉下去。
你知道存在樓層 F ,滿足 0 <= F <= N 任何從高於 F 的樓層落下的雞蛋都會碎,從 F 樓層或比它低的樓層落下的雞蛋都不會破。
每次移動,你可以取一個雞蛋(如果你有完整的雞蛋)並把它從任一樓層 X 扔下(滿足 1 <= X <= N)。
你的目標是確切地知道 F 的值是多少。
無論 F 的初始值如何,你確定 F 的值的最小移動次數是多少?*

**

思路:

**
//dp[k][m] 的含義是k個雞蛋 移動m次最多能夠確定多少樓層
//第一個雞蛋扔完,碎了剩下能確定的dp[k - 1][m - 1]下邊的樓層,沒碎剩下能確定的dp[k][m - 1]上 邊的樓層,+1本層
//dp[k][m] = dp[k - 1][m - 1] + dp[k][m - 1] + 1
//dp[k][1]=1;dp[1][m]=m

/ 可直接給出解
   if (K == `1 || N` == `1 || N` == 2) 
     {
        return N;
     }

//由於 m 爲所求值,創建二維數組時,無法確定 m 值,因此,以 一維數組 代替 二維數組 進行計算;則每一個座標的值等於 當前位置值 + 前一位置值 + 1

 // 初始化首列(第一步)
int *dp = new int[K + 1];
  for (int index = 1; index <= K; index++) 
  {
 dp[index] = 1;
 }

 // 從第二步開始計算
int m = 2;
while (true) 
{
      for (int k = K; k > 1; k--) 
    {  // 從後向前計算,以免 k-1 位置過早被新值覆蓋,導致後續計算錯誤。
    //相當於還帶有m-1,dp[k][m] = dp[k - 1][m - 1] + dp[k][m - 1] + 1,形式上省略了
    dp[k] = dp[k] + dp[k - 1] + 1;
    }

  // 判斷是否滿足條件
  if (dp[K] >= N) 
  {
    return m;
  } 
  else 
  {
    dp[1] = m;  // 覆蓋首位值
    m++;  // 進入下一步
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章