官方单调性解法
/**
*
* 【单调性 - 鸡蛋掉落】
*
* 思路:
* 当K固定时, 交点随着n增加而增加,即x随着n的增加而增加。
* 单调性,请参见图1。
* 即大致代码:
* for(let i = 1; i <= n; i++)
* x++;
*
*/
function dpEgg(kk, nn) {
// 初始化
let dp = [];
// 初始化一颗鸡蛋时。
for (let i = 0; i <= nn; i++) {
dp[i] = i;
}
// 固定 K 值
for (let k = 2; k <= kk; k++) {
let x = 1;
// curDp. 当前k时候,dp的值
const dp2 = new Array(nn+1).fill(0);
// n 逐步增加
for (let n = 1; n <= nn; n++) {
/**
* 令:f(x) = Max(dp(k-1, x - 1), dp(k, n - x))
* 当 x 小于 【合适值】 的时候, f(x) > f(x + 1), 则需要 x++;
* 【合适值】: 可以参考图2.
*
* 即 Max[dp(k-1,x-1),dp(k,n-x)] > Max[dp(k-1,(x+1)-1),dp(k,n-(x+1))]
* 令:
* dp = dp(k-1)
* dp2 = dp(k)
* 那么,简化方程:
* Max[dp(x-1), dp2(n-x)] > Max[dp(x), dp2(n-x-1)]
*
*/
while (x < n && Math.max(dp[x - 1], dp2[n - x]) > Math.max(dp[x], dp2[n - x - 1])) {
// 此处,相当于固定K,x随着n的增加而增加
x++;
}
// 赋值dp2. 即k时的dp. 即 dp[k][n]
dp2[n] = 1 + Math.max(dp[x - 1], dp2[n-x]);
}
/**
* dp = dp2
* 即将 【当前dp】dp2 赋值 dp.
* 将 k - 1时的 dp, 覆盖为k时,[当前dp] dp2。
*
* 即
* dpPre = dpCur
*
*/
dp = dp2;
}
return dp[nn];
}
const result = dpEgg(2, 100);
console.log('========result=========', result);
【图-1】
当固定k的时候, dp(k-1,x-1)的结果,跟n没有关系。
当固定k的时候, dp(k, n-x)的结果,随着n的增加,交点也越来越大。即(x随着n的增加而增加)
【图-2】
设 相交 的时候【即:f(x) = max(dp(k-1,x-1),dp(k, n-x) 最小时】, x = t;
当 x 在区间[1, t]的时候, f(x) > f(x+1);