1 条题解

  • 0
    @ 2024-8-10 20:35:03

    动态规划(DPDP)。

    dp[i]dp[i] 表示 ii 位置经过最少的 BB ,那么

    $dp(i) = \begin{cases}min(dp[i - 1], dp[i - 2]) + 1 & s[i] = B \\ min(dp[i - 1], dp[i - 2]) & s[i] != B\end{cases}$

    WW 同理。

    #include <bits/stdc++.h>
    
    using i64 = long long;
    
    int main() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
    
        int n;
        std::cin >> n;
    
        std::string s;
        std::cin >> s;
    
        std::vector<std::pair<int, int>> dp(n + 1);
        dp[1] = {s[0] == 'B', s[0] == 'W'};
        for (int i = 2; i <= n; ++i) {
            dp[i].first = std::min(dp[i - 1].first, dp[i - 2].first) + (s[i - 1] == 'B');
            dp[i].second = std::min(dp[i - 1].second, dp[i - 2].second) + (s[i - 1] == 'W');
        }
    
        int q;
        std::cin >> q;
    
        while (q--) {
            int x;
            char y;
            std::cin >> x >> y;
            std::cout << (y == 'B' ? dp[x].first : dp[x].second) << "\n";
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    41
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    56
    已通过
    16
    上传者