1 条题解

  • 0
    @ 2025-4-14 12:59:42

    C++代码

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        vector<int> b(n);
        for (int i = 0; i < n; ++i) {
            cin >> b[i];
        }
        
        if (n == 1) {
            cout << (b[0] == 0 || b[0] == 1 ? 1 : 0) << endl;
            return 0;
        }
        
        vector<vector<int>> prev_dp(2, vector<int>(2, 0));
        // 初始化i=0的情况
        for (int a0 = 0; a0 <= 1; ++a0) {
            for (int a1 = 0; a1 <= 1; ++a1) {
                if (a0 + a1 == b[0]) {
                    prev_dp[a0][a1] = 1;
                }
            }
        }
        
        for (int i = 1; i < n - 1; ++i) {
            vector<vector<int>> curr_dp(2, vector<int>(2, 0));
            for (int p = 0; p <= 1; ++p) {
                for (int q = 0; q <= 1; ++q) {
                    if (prev_dp[p][q] == 0) continue;
                    int a_curr = b[i] - p - q;
                    if (a_curr < 0 || a_curr > 1) continue;
                    curr_dp[q][a_curr] += prev_dp[p][q];
                    curr_dp[q][a_curr] %= 1000000007; // 防止溢出,题目未明确模数,但通常可能需要
                }
            }
            prev_dp = move(curr_dp);
        }
        
        int result = 0;
        for (int p = 0; p <= 1; ++p) {
            for (int q = 0; q <= 1; ++q) {
                if (p + q == b[n-1]) {
                    result += prev_dp[p][q];
                    result %= 1000000007;
                }
            }
        }
        
        cout << result << endl;
        return 0;
    }
    

    信息

    ID
    2761
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者