题目
方法二 决策单调性
考虑将标准写法(请自行查看leetcode标准解析或其他)的递归公式变为迭代公式。
首先理解K和N增加时,曲线怎样移动(见图1)。当K固定时,增加N,T1与T2的交点是会逐步逼近Xopt。但图像逼近不是目的,目的是为了求解递归方程。
图一 官方方法二解析
在递归方程如中,有两个变量分别是K和N。我们的目的是为了求解dp(K, N),当我们只关注左边项K时,可以看到,dp(K,)项是由dp(K-1,)和dp(K,*)项求得的。也就是说,我们要先求出K-1个鸡蛋扔所有楼层的情况,才能推知K个鸡蛋扔所有楼层的情况。并且,我们还可以看到,dp(K, N)项的求解还需要dp(K, N-K)项。我们忽略K项,也就是说,数组的第N项需要用到数组的第N-X项。如果我们从左到右求解,即从0到n-1,由于N-X<N,所以第N项的求解只会用到比该数下标小的的值,是能正常求出来的。所以,综上两者,我们在求解dp(K,N)时,需要用到dp(K-1,X-1)和dp(K,N-X),这正好符合递归问题的迭代解法。所以假设,在固定K情况下,设dp(X) = dp(K-1, X),dp2(X) = dp(K, N-X),上式变为dp(N)=1+min{1<=X<=N)(max(dp(X-1), dp2(N-X)))。
代码解析:
- 一个鸡蛋,直接赋值为楼层数。 dp代表状态转移方程中max()中左边的式子,也即斜率为正的曲线。dp2代表右边的式子,即斜率为负的曲线。
- 最外层的k循环,代表鸡蛋数逐渐增多,用于dp(K-1, X-1)求解dp(K,N)的推导。即用数组第一行推数组第二行。
- 内层的n循环,代表楼层数增多,用于dp(K, N-X)求解dp(K,N)的推导。即用数组的前面元素推后面元素。 while(x<n &&
- max(dp[x-1], dp2[n-x]) > max(dp[x],
- dp2[n-x-1])这句。x是曲线交点的楼层近似数,x不能大于整个楼层数n。后面一个判断,拆开就是:max(dp(K-1, X-1),
- dp(K, N-X)) > max(dp(K-1, X), dp(K, N-X-1))。是不是就是在曲线上比较相邻两点,以求解最合适的点。
- dp2[n] = 1 + max(dp[x-1], dp2[n-x])。就是在找到Xopt后,返回交点的最大值。
- dp =dp2。交换数组,继续下一次迭代。