当i>1时, dp[i][0]=max(dp[i-1][1],dp[i-1][0])
时间: 2023-10-23 13:11:05 浏览: 90
这个说法也是正确的。当i>1时,dp[i][0]表示考虑前i间店铺,第i间店铺不偷的情况下,能够盗窃的现金的最大值。根据题意,当第i间店铺不偷的时候,晶晶可以选择偷或者不偷第i-1间店铺,取两种情况中的最大值即可。因此,dp[i][0]可以从第i-1间店铺偷或者不偷的情况转移过来,即dp[i][0] = max(dp[i-1][1], dp[i-1][0])。这个转移方程的意义是,在前i-1间店铺中偷或者不偷第i-1间店铺的前提下,能够获得的现金的最大值为dp[i-1][1]或dp[i-1][0],取两者中的最大值,就得到了在前i间店铺中不偷第i间店铺的前提下,能够获得的现金的最大值dp[i][0]。
相关问题
def lcs(s1, s2): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) res = "" i, j = m, n while i > 0 and j > 0: if s1[i-1] == s2[j-1]: res = s1[i-1] + res i -= 1 j -= 1 elif dp[i-1][j] > dp[i][j-1]: i -= 1 else: j -= 1 return res, dp[m][n]运行不出来
这段代码如果运行不出来,很可能是因为缺少函数调用。你需要在代码的下面添加调用函数的语句,例如:
```python
s1 = "ABCD"
s2 = "EACB"
print(lcs(s1, s2)) # 输出:('AC', 2)
```
这里将两个字符串s1和s2作为参数传递给lcs函数,并将结果打印输出。你可以根据自己的需要修改这些参数。
当i>1时,dp[0][1]=max(dp[i-1][1],dp[i-1][0])+a[i]
这个说法是不正确的。当i>1时,dp[0][1]是没有定义的,因为dp[i][1]表示考虑前i间店铺,其中必偷第i间店铺的前提下,能够盗窃的现金的最大值,而dp[0][1]表示考虑前0间店铺,其中必偷第0间店铺的前提下,能够盗窃的现金的最大值,是没有意义的。
此外,状态转移方程应该为:
当 i > 1 时,
dp[i][0] = max(dp[i-1][0], dp[i-1][1]) # 第i间店铺不偷
dp[i][1] = dp[i-1][0] + a[i] # 第i间店铺偷
当 i = 1 时,
dp[1][0] = 0 # 第1间店铺不偷
dp[1][1] = a[1] # 第1间店铺偷
其中,dp[i][0]表示考虑前i间店铺,第i间店铺不偷的情况下,能够盗窃的现金的最大值;dp[i][1]表示考虑前i间店铺,第i间店铺必须偷的情况下,能够盗窃的现金的最大值。a[i]表示第i间店铺内藏有的现金量。
对于第i间店铺不偷的情况,有两种选择:偷第i-1间店铺或者不偷第i-1间店铺,取两种情况中的最大值即可;对于第i间店铺必须偷的情况,只能从第i-1间店铺不偷的情况转移过来。因此,状态转移方程为上述形式。
阅读全文