就假如當前有n層樓要確認,k個雞蛋。那麼列舉當前雞蛋放在x後變成了兩個子問題dfs(x-1,k-1),dfs(n-x,k),dfs就好。複雜度為o(nkn)狀態數枚舉次數
考慮到dp[n][k]隨著n遞增而遞增,所以固定k對所有x畫圖後發現 dfs(x-1,k-1)遞增,dfs(n-x,k) 遞減。那麼要想使他倆的最大值最小直接二分就可以了(找到最後乙個l使得dfs(l-1,k-1)《=dfs(n-l,k) 和最小的r(前面的式子返回來))。
複雜度o(nk*log(n))
class
solution
} ans=1+
min(
max(
dfs(l-
1,k-1)
,dfs
(n-l,k)),
max(
dfs(n-r,k)
,dfs
(r-1
,k-1))
);} m[n*
1000
+k]=ans;
}return m[n*
1000
+k];
}public
:int
supereggdrop
(int k,
int n)
};
注意到對於dp[k][n] 的最優決策點一定在dp[k][n-1]的最優決策點右邊,所以可以o(n*k)直接dp
口胡證明:設dp[k][n-1]的決策點為x,那麼dp[k][n]的所有決策點的遞增函式和dp[k][n-1]的遞增函式影象是一致的(前n-1個),而遞減影象為dp[k][n-1]的遞減影象上移一定單位得到的,所以最優決策點,也就是交點,一定是向右移動的。
那麼我們在dp的時候維護乙個最優決策點的位置就好了
class
solution
swap
(dp,new_dp);}
return dp[n];}
public
:int
supereggdrop
(int k,
int n)
};
887 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...
887 雞蛋掉落
你將獲得k個雞蛋,並可以使用一棟從1到n共有n層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層f,滿足0 f n任何從高於f的樓層落下的雞蛋都會碎,從f樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道f的值是多少。無論f的初始值如何,你確定f的值的最...
887 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...