返回
2100.适合打劫银行的日子
后端
2023-09-08 02:04:25
前言
大家好,我是刷题日记的作者,今天我们一起来解决 leetcode 2100 题:适合打劫银行的日子 。
题目
你打算抢劫一家银行,这家银行每一天的收益都不同。你抢劫只能连续进行,不能跳过任何一天。抢劫某一天的收益可以让你满足当日的开销。
给你一个下标从 0 开始的整数数组 security
,其中 security[i]
是第 i
天你抢劫这家银行需要花费的安保费用。你不能在同一天同时抢劫和花费安保费用。
返回你可以获得的 最大收益 。
示例 1
输入:security = [2,7,9,3,1]
输出:12
解释:你可以选择:
- 第 0 天抢劫,花费 2 美元,收益为 7 美元。
- 第 1 天抢劫,花费 7 美元,收益为 9 美元。
- 第 3 天抢劫,花费 3 美元,收益为 1 美元。
总收益为 7 + 9 + 1 = 12 美元。
示例 2
输入:security = [1,3,4,2,2,3,1,3]
输出:9
解释:你可以选择:
- 第 1 天抢劫,花费 3 美元,收益为 4 美元。
- 第 3 天抢劫,花费 2 美元,收益为 3 美元。
- 第 6 天抢劫,花费 1 美元,收益为 3 美元。
总收益为 4 + 3 + 3 = 9 美元。
解题思路
本题可以使用动态规划解决。定义一个长度为 n
的数组 dp
,其中 dp[i]
表示考虑前 i
天,抢劫能获得的最大收益。
状态转移方程
状态转移方程如下:
dp[i] = max(dp[i-1], dp[i-2] + security[i] - security[i-1])
其中:
dp[i-1]
表示不抢劫第i
天的收益dp[i-2] + security[i] - security[i-1]
表示抢劫第i
天的收益
代码实现
def max_profit(security):
n = len(security)
dp = [0] * n
dp[0] = security[0]
dp[1] = max(security[0], security[1])
for i in range(2, n):
dp[i] = max(dp[i-1], dp[i-2] + security[i] - security[i-1])
return dp[n-1]
时间复杂度
时间复杂度为 O(n),其中 n 为数组长度。
空间复杂度
空间复杂度为 O(n),用于存储动态规划数组。
总结
本题考察了动态规划的基本思想,通过巧妙地定义状态和状态转移方程,我们可以高效地解决问题。掌握动态规划技术对解决一系列最优化问题至关重要。