AcWing 1058. 股票买卖 V 状态机模型dp

//初始状态(入口)转移到手中无货的第>=2天
//最终状态(出口)可能从手中无货的第一天转移过来,或者从手中无货的第>=2天
//f[i,0]表示走到第i天,且位于手中有货的状态
//f[i,1]表示走到第i天,且位于手中无货的第一天的状态
//f[i,2]表示走到第i天,且位于手中无货的第>=2天的状态
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, INF = 0x3f3f3f3f;
int n;
int w[N];
int f[N][3];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
    f[0][0] = f[0][1] = -INF, f[0][2] = 0;
    for (int i = 1; i <= n; i ++ ) { //状态转移
        f[i][0] = max(f[i - 1][0], f[i - 1][2] - w[i]);
        f[i][1] = f[i - 1][0] + w[i];
        f[i][2] = max(f[i - 1][2], f[i - 1][1]);
    }
    printf("%d
", max(f[n][1], f[n][2]));
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12010746.html