拋雞蛋 玻璃球或圍棋 優化版

2021-06-18 19:48:13 字數 1074 閱讀 8386

題目:乙個100層的大廈,你手中有兩個相同的雞蛋(玻璃球或圍棋)。從這個大廈的某一層扔下雞蛋((玻璃球或圍棋))就會碎,用你手中的這兩個雞蛋(玻璃球或圍棋),找出乙個最優的策略,來得知那個臨界層面。

分析:這道題比較直觀的想法是通過二分來尋找,但是二分的解法應該不是最優的。這裡討論通過動態規劃的思路來求解。這裡的最優策略指的是在這種策略下無論哪個臨界層面在第幾層,測試的次數都最少。設f(n,k)為用k個玻璃球來測試n層大廈的臨界層的最少次數,狀態轉移方程如下:

f(n,k)=min+1, 1<=r<=n},邊界條件:f(n,1)=n, f(1,k)=1  f(0,k)=0(原文中f(n,1)=n-1, f(1,k)=0  f(0,k)=0,考慮到最頂層也可能不碎,所以更改邊界條件)

狀態轉移方程可以這樣來考慮,假設在n層樓中的第r層拋一次(對應方程中的"+1"),會有兩種情況發生:

過程如下圖所示

因為考慮的是最壞情況下拋球策略的所需測試次數的最小值,所以取這兩種情況中的較大值,並遍歷每乙個可能的r,取其最小值即得到f(n,k)。實現**如下:

c**  

#include

#include

#include

#define max_floor 512    

#define max_ball  100    

using namespace std;

int dp(int n, int k)    

for(j=2;j<=n;j++)

/*  

*          狀態轉移方程:  

*                  f(n,k)=min, 1<=r<=n}  

*                      */    

for(i=2;i<=k;i++)    

for(j=2;j<=n;j++)    

if(temp}

}return m[k][n];//f(n,k)    

}    

int main() 

動態規劃解拋雞蛋 玻璃球 問題

昨天早上看了題經典老題,拋玻璃球,也有的版本是拋雞蛋,可惜昨天早上愣是沒做出來,下午忙別的事去了,到了晚上看了chinaunix上的一篇 討論帖才知道如何解,事實上我一開始對題目的理解就錯了,於是根本沒有想到用dp。今天總算有時間整理一下思路,並把 實現出來了。題目是這樣的 乙個100層的大廈,你手...

玻璃球遊戲

題目描述 小x的業餘生活中,有一項是玩滾玻璃球遊戲。某天,小x想到了一種很無趣的玩法,當然,這種玩法就是為了玩看題的你們。小x首先建立了乙個單向軌道,這個單向軌道可以抽象成乙個有向圖,每個頂點的出度都是1,也就是由每個點出發,只有一條邊連向其他的點。小x的遊戲最初規則是這樣的 讓玻璃球從某乙個點出發...

三個雞蛋(玻璃球 圍棋子)確定樓層問題公式推導

文章原先發表在 1 題目是這樣的 乙個 100層的大廈,你手中有兩個相同的玻璃球。從這個大廈的某一層扔下圍棋子就會碎,用你手中的這兩個玻璃圍棋子,找出乙個最優的策略,來得知那個臨界層面。這裡的最優策略指的是在這種策略下無論哪個臨界層面在第幾層,測試的次數最少。我一開始就是把題意理解錯了,給了乙個非最...