0
点赞
收藏
分享

微信扫一扫

【算法】leetcode887鸡蛋掉落题之方法二解析

兔八哥软件爱分享 2022-03-19 阅读 25
算法

题目

在这里插入图片描述
在这里插入图片描述


方法二 决策单调性

考虑将标准写法(请自行查看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。交换数组,继续下一次迭代。

代码

在这里插入图片描述

举报

相关推荐

0 条评论