动态规划进阶:深度解析序列决策与状态机模型
在处理具有复杂限制条件的动态规划问题时,单一的状态定义往往难以涵盖所有决策分支。通过将每一天的局面拆解为多个互斥的快照(States),并利用状态机描述其间的转移逻辑,可以有效地消除后效性,使问题迎刃而解。
一、 '打家劫舍'模型:状态拆分的起点
这类题目的核心在于处理'相邻元素互斥'的约束。
题目:198.打家劫舍

- 状态表示:
f[i]:表示偷到第 i 个位置时,确定偷 nums[i],此时的最大金额。g[i]:表示偷到第 i 个位置时,确定不偷 nums[i],此时的最大金额。
- 状态转移方程:基于'最后一步'的决策逻辑:
f[i] = g[i-1] + nums[i]:若偷当前房,前一间房必须处于'不偷'状态。g[i] = max(f[i-1], g[i-1]):若不偷当前房,前一间房偷或不偷均可,取最大值即可。
初始化:f[0] = nums[0],g[0] = 0。

代码实现:
class Solution {
public:
int rob(vector<int>& nums) {
//跟按摩师一样
int n = nums.size();
vector<int> f(n);
auto g = f;
f[0] = nums[0];
for (int i = 1; i < n; ++i) {
f[i] = g[i - ] + nums[i];
g[i] = (f[i - ], g[i - ]);
}
(f[n - ], g[n - ]);
}
};














