Compare commits

...

3 Commits

Author SHA1 Message Date
8b1f7317ff feat: 实现炮兵阵地问题的动态规划解法
添加动态规划解决方案来计算炮兵阵地的最大部署数量。使用状态压缩和预处理来优化性能,处理输入地图并计算合法状态及其对应的炮兵数量。
2025-08-31 14:23:00 +08:00
84436ffbbe feat: 添加P2704.cpp基础框架 2025-08-31 11:13:06 +08:00
000e34da46 refactor(test.cpp): 替换cstdio为iostream并简化测试逻辑
将测试文件中的cstdio替换为iostream,并移除不必要的指针操作。
简化测试逻辑,直接测试位移操作并输出结果。
2025-08-31 11:12:40 +08:00
2 changed files with 87 additions and 8 deletions

81
src/8/31/P2704.cpp Normal file
View File

@ -0,0 +1,81 @@
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
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<int> 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<int> states;
std::vector<int> 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<std::vector<std::vector<int>>> dp(n + 1, std::vector<std::vector<int>>(num, std::vector<int>(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;
}

View File

@ -1,10 +1,8 @@
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int a=0;
char* c = (char*)&a;
c[0]=0x1f;
c[1]=0x1f;
c[2]=0x1f;
c[3]=0x1f;
printf("%d\n",a);
int a = 1;
a<<=32;
cout<<a<<"\n";
}