有乙個傻x無聊的公司用扔雞蛋的辦法測試雞蛋硬度,求最壞情況要扔幾次,只能從第一層扔到第n層,如果這個雞蛋在第n層沒碎,在n+1層碎了,這個雞蛋的硬度就是n。然後多事的小a又想著用二分,結果想到自己都煩還在想。(無聊的小a)然後又讓你幫他解決問題。
【輸入】
輸入包括多組資料,每組資料一行,包含兩個正整數n和m(1≤n≤100,1≤m≤10),其中n表示樓的高度,m表示你現在擁有的雞蛋個數,這些雞蛋硬度相同(即它們從同樣高的地方掉下來要麼都摔碎要麼都不碎),並且小於等於n。你可以假定硬度為x的雞蛋從高度小於等於x的地方摔無論如何都不會碎(沒摔碎的雞蛋可以繼續使用),而只要從比x高的地方扔必然會碎。
對每組輸入資料,你可以假定雞蛋的硬度在0至n之間,即在n+1層扔雞蛋一定會碎。
【輸出】
對於每一組輸入,輸出乙個整數,表示使用最優策略在最壞情況下所需要的扔雞蛋次數。
【輸入樣例】
100 1
100 2
【輸出樣例】
100
14其實就是記憶化搜尋
先要處理好邊界問題吧:
if (m==1) return f[n][m]=n; //如果只有乙個雞蛋,那只能扔n次,不然直接碎了就沒機會了。
if (m==0) return f[n][m]=0; //沒有雞蛋扔個皮皮蝦
if (n==1) return f[n][m]=1; //只有一層樓還用說嗎?就算這個雞蛋的硬度是10^1000000,還是只能測出來是1。
if (n==0) return f[n][m]=0; //樓都沒有扔個皮皮蝦。
好了,邊界處理好了
重點來了
你們最想要的動態轉移方程 f[
n][m
]=mi
n(f[
n][m
],1+
max(
dp(i
−1,m
−1),
dp(n
−i,m
)));
//i=
1..n
f [n
][m]
=min
(f[n
][m]
,1+m
ax(d
p(i−
1,m−
1),d
p(n−
i,m)
));/
/i
=1..
n
#include
#include
#define inf 0x3f
#define r(i,a,b) for(int i=a;i<=b;i++)
using
namespace
std;
int n,m,ans,f[101][101];
int max(int x,int y)
int min(int x,int y)
int dp(int n,int m)
int main()
雞蛋的硬度(線性dp)
題目描述 最近xx公司舉辦了乙個奇怪的比賽 雞蛋硬度之王爭霸賽。參賽者是來自世界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法 從高度扔雞蛋 來測試雞蛋的硬度,如果一次母雞下的蛋從高樓的第a層摔下來沒摔破,但是從a 1層摔下來...
NOI庫7627 雞蛋的硬度
題目 分析 dp 1.先想乙個簡單問題 只有兩個雞蛋的問題 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見兩個雞蛋 一道google面試題 這是典型的動態規劃問題。...
OpenJudge 7627 雞蛋的硬度
描述 最近xx公司舉辦了乙個奇怪的比賽 雞蛋硬度之王爭霸賽。參賽者是來自世 界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法 從高度扔雞蛋 來 測試雞蛋的硬度,如果一次母雞下的蛋從高樓的第a層摔下來沒摔破,但是從a 1層摔下來...