【线性dp】POJ4150: 上机
【线性dp】POJ4150: 上机
https://vjudge.net/problem/OpenJ_Bailian-4150
今天被问了一道dp,不是很难,但是我还是想不出状态怎么设,所以爬回来写题姐QAQ
主要是要把状态设出来(图画了好久,写的时候才发现一开始我没有完全理解,所以以后做dp都要尝试画画图!):
理论上来说也不需要代码了:
哦对,要注意左边界的初始化!!
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5, inf = 0x3f3f3f3f;
int n, a[N], b[N], c[N], f[N][4];
int main () {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++) cin >> c[i];
f[1][0] = a[1], f[1][1] = f[1][3] = -inf, f[1][2] = b[1]; //左端点初始化
for (int i = 2; i <= n; i++) {
f[i][0] = max (f[i-1][2], f[i-1][3]) + a[i];
f[i][1] = max (f[i-1][0], f[i-1][1]) + b[i];
f[i][2] = max (f[i-1][2], f[i-1][3]) + b[i];
f[i][3] = max (f[i-1][0], f[i-1][1]) + c[i];
}
cout << max (f[n][0], f[n][1]); //最右边的人右边一定没人
}