1884. 鸡蛋掉落-两枚鸡蛋
DP , 从最简单的case开始 假如只有一个鸡蛋 那在 0 -n 楼种 要测试出那一楼 最坏情况就是n次 因为得一个一个试
那么有两个鸡蛋呢 , 可以先 用一个鸡蛋在 0-n 楼的某一楼 j 种试一下, 那如果破了 就只剩一个鸡蛋了 情况就变成 在 j楼 只有一个鸡蛋 ;那如果没破呢 那就把范围缩小到 n-j 这个范围内,而且有两个鸡蛋
然后就可以根据上述写出dp表达式
dp[0][i] = min(dp[0][i],max(dp[1][j-1]+1,dp[0][i-j]+1))
dp[0]表示碎了 0颗鸡蛋
class Solution:
def twoEggDrop(self, n: int) -> int:
dp=[[1000]*(n+1) for _ in range(2)]
for i in range(n+1):
dp[1][i] = i
dp[0][1] = 1
dp[0][0]= 0
for i in range(n+1):
for j in range(i):
dp[0][i] = min(dp[0][i],max(dp[1][j-1]+1,dp[0][i-j]+1))
return dp[0][n]
参考大佬的数学递推式
大致的想法就是要找到让公式1 + 2 + 3 + 4 + … + x >= n成立的最小的x就是最后找到f的最小次数。所以也就是首项为1, 公差为1的等差数列的求和公式(x * (x + 1) / 2) >= n,然后解方程,求出x。
class Solution:
def twoEggDrop(self, n: int) -> int:
return math.ceil( ((1+8*n)**0.5 - 1)/2 )
1446. 连续字符
记录每个点当前最大值,okk 其实也可以只记录前一个 和全局最大 节省空间
class Solution:
def maxPower(self, s: str) -> int:
dp=[1]*len(s)
for i in range(1,len(s)):
if s[i]==s[i-1]:
dp[i]=dp[i-1]+1
return max(dp)