菜鸟心得-鸡蛋掉落-官方题解理解【2】

172 阅读1分钟

官方单调性解法

/**
 * 
 * 【单调性 - 鸡蛋掉落】
 *   
 * 思路:
 *    当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的增加而增加) image.png

【图-2】

设 相交 的时候【即:f(x) = max(dp(k-1,x-1),dp(k, n-x) 最小时】, x = t; 当 x 在区间[1, t]的时候, f(x) > f(x+1); image.png