【线性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]); //最右边的人右边一定没人
}
posted @ 2022-10-28 17:21  Sakana~  阅读(93)  评论(0编辑  收藏  举报