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
- 上傳者