返回

2100.适合打劫银行的日子

后端

前言

大家好,我是刷题日记的作者,今天我们一起来解决 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),用于存储动态规划数组。

总结

本题考察了动态规划的基本思想,通过巧妙地定义状态和状态转移方程,我们可以高效地解决问题。掌握动态规划技术对解决一系列最优化问题至关重要。