1 条题解
-
0
动态规划()。
令 表示 位置经过最少的 ,那么
$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}$
同理。
#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
- 上传者