2382. 劫富济贫

1000ms 256MB 简单 动态规划 Dynamic Programming
题目描述
一个月黑风高的夜晚,悟空潜入了赌馆,赌馆里边有一排保险箱,每个保险箱里边有不同数量的银子。悟空可以轻易的撬开这些保险箱。不过保险箱装有报警系统,如果两个相邻的保险箱被撬开,系统就会自动报警。请计算在不触动警报装置的情况下,悟空最多能获得多少银子。
输入格式
- 第一行包含一个正整数 $N$ ($1 \le N \le 100000$),表示保险箱的数量。 - 第二行包含 $N$ 个非负整数,表示每个保险箱中的银两数量,数与数之间用空格隔开。
输出格式
- 输出一个整数,表示在不选择相邻保险箱的情况下,能获得的最大银两总数。
样例 1
输入 (Input)
5
2 7 9 3 1
输出 (Output)
12
- 对于 $100\%$ 的数据:$1 \le N \le 100000$,每个保险箱中的银两数量为非负整数,且单项大小在 $[0, 10^9]$ 范围内。 - **注意**:累加的最大银两总数可能会超出 32 位有符号整型(`int`)的表示上限,因此程序中用于保存状态及累加和的变量必须使用 **`long long`** 类型。 - **算法提示**: 本题可通过**动态规划**求解。 1. 设 $dp[i]$ 表示前 $i$ 个保险箱在不触发报警时所能获得的最大银两数。 2. 状态转移逻辑:对于第 $i$ 个保险箱,我们有两种选择: - **不撬开**:此时最大收益等于前 $i-1$ 个保险箱的最大收益,即 $dp[i] = dp[i-1]$; - **撬开**:此时不能撬开第 $i-1$ 个,最大收益等于前 $i-2$ 个的最大收益加上当前保险箱的银两,即 $dp[i] = dp[i-2] + a[i]$。 3. 综合两种情况,状态转移方程为: $$dp[i] = \max(dp[i-1], dp[i-2] + a[i])$$ 4. **空间优化**:由于 $dp[i]$ 仅与 $dp[i-1]$ 和 $dp[i-2]$ 相关,可使用两个变量(`prev1` 和 `prev2`)交替滚动记录,将空间复杂度从 $O(N)$ 降至 $O(1)$。
自测终端 stdin → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字