1 条题解

  • 0
    @ 2025-10-3 23:19:31

    dp 题,没有测试数据😭,应该是对的吧😋

    #include <bits/stdc++.h>
    using namespace std;
    constexpr int inf = 0x3f3f3f3f;
    
    void solve() {
        int n;
        cin >> n;
        vector a(n, 0);
        for (auto &i : a) {
            cin >> i;
        }
        vector dp(n, vector(3, inf));
    
        dp[0][0] = 1;
        if (a[0] == 3) {
            dp[0][1] = 0;
            dp[0][2] = 0;
        } else if (a[0] == 2) {
            dp[0][2] = 0;
        } else if (a[0] == 1) {
            dp[0][1] = 0;
        }
    
        auto _0 = [&](int i) {
            dp[i][0] = min(min(dp[i - 1][0], dp[i - 1][1]), dp[i - 1][2]) + 1;
        };
    
        auto _1 = [&](int i) {
            dp[i][1] = min(min(dp[i - 1][0], dp[i - 1][2]), dp[i - 1][1] + 1);
        };
    
        auto _2 = [&](int i) {
            dp[i][2] = min(min(dp[i - 1][0], dp[i - 1][1]), dp[i - 1][2] + 1);
        };
    
    
        for (int i = 1; i < n; ++i) {
            _0(i);
            if (a[i] == 3) {
                _1(i);
                _2(i);
            } else if (a[i] == 2) {
                _2(i);
            } else if (a[i] == 1) {
                _1(i);
            }
        }
    
        cout << min(min(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]) << '\n';
    }
    
    int main() {
        int t;
        cin >> t;
        while (t--) solve();
        return 0;
    }
    
    • 1

    信息

    ID
    433
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    0
    上传者