From 8b1f7317ff0d1c520b44e15f43ad20c30c18a190 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Sun, 31 Aug 2025 14:23:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E7=82=AE=E5=85=B5?= =?UTF-8?q?=E9=98=B5=E5=9C=B0=E9=97=AE=E9=A2=98=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加动态规划解决方案来计算炮兵阵地的最大部署数量。使用状态压缩和预处理来优化性能,处理输入地图并计算合法状态及其对应的炮兵数量。 --- src/8/31/P2704.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/src/8/31/P2704.cpp b/src/8/31/P2704.cpp index 294989d..9bbce64 100644 --- a/src/8/31/P2704.cpp +++ b/src/8/31/P2704.cpp @@ -1,3 +1,81 @@ -int main(){ - -} \ No newline at end of file +#include +#include +#include +#include + + +static inline constexpr int popcount(int x) { + return __builtin_popcount(x); +} + +int main() { + std::ios_base::sync_with_stdio(false); + std::cin.tie(NULL); + + int n, m; + std::cin >> n >> m; + + std::vector map(n + 1, 0); + for (int i = 1; i <= n; ++i) { + std::string row; + std::cin >> row; + for (int j = 0; j < m; ++j) { + if (row[j] == 'H') { + map[i] |= (1 << j); + } + } + } + + std::vector states; + std::vector counts; + for (int i = 0; i < (1 << m); ++i) { + + if (!((i << 1) & i) && !((i << 2) & i)) { + states.push_back(i); + counts.push_back(popcount(i)); + } + } + int num = states.size(); + + std::vector>> dp(n + 1, std::vector>(num, std::vector(num, 0))); + + for (int i = 1; i <= n; ++i) { + + for (int j = 0; j < num; ++j) { + int si = states[j]; + + if (si & map[i]) { + continue; + } + + for (int k = 0; k < num; ++k) { + int sim1 = states[k]; + + if (si & sim1) { + continue; + } + + for (int l = 0; l < num; ++l) { + int sim2 = states[l]; + + if ((si & sim2) || (sim1 & sim2)) { + continue; + } + + dp[i][j][k] = std::max(dp[i][j][k], dp[i - 1][k][l] + counts[j]); + } + } + } + } + + int ans = 0; + for (int j = 0; j < num; ++j) { + for (int k = 0; k < num; ++k) { + ans = std::max(ans, dp[n][j][k]); + } + } + + std::cout << ans << std::endl; + + return 0; +}