0. 前言
曾经简单学习过状态机 dp
。可参考 [Hdp] lc188. 买卖股票的最佳时机 IV(状态机模型dp+线性dp+空间优化)。
状态机在语言设计、编译原理、游戏里面是很重要的一个概念。在此我不太了解,可自行查阅。
状态机模型有很多题目可以解释,如:力扣上打家劫舍、股票买卖这一系列问题。
1. 状态机模型
朴素线性 dp
朴素 dp
思路其实很好想,但是在计算状态 i
时,同涉及到了 i-1
、i-2
层这两个状态。通过
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5+5;
int n;
int a[N];
int f[N];
int main() {
int T;
cin >> T;
while (T --) {
memset(f, 0, sizeof f);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
f[1] = a[1]; // 注意初始化
for (int i = 2; i <= n; ++i)
f[i] = max(f[i - 1], f[i - 2] + a[i]);
cout << f[n] << endl;
}
return 0;
}
状态机模型
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5+5, INF = 0x3f3f3f3f;
int n;
int a[N];
int f[N][2];
int main() {
int T;
cin >> T;
while (T --) {
memset(f, 0, sizeof f);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
f[0][0] = 0, f[0][1] = -INF;
for (int i = 1; i <= n; ++i) {
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = f[i - 1][0] + a[i];
}
cout << max(f[n][0], f[n][1]) << endl;
}
return 0;
}