社区讨论
样例错误求调(玄关 码风优良)
P2704[NOI2001] 炮兵阵地参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lz2k7frz
- 此快照首次捕获于
- 2024/07/26 18:28 2 年前
- 此快照最后确认于
- 2024/07/26 19:37 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 100;
const int N = 1e5 + 100;
int a[N];
int mp[200][200] , fmap[105][200] ;
int dp[105][200][200];
int flag[N] , can[N] , cnt , num[N];
int n , m;
void init()
{
int len = (1 << m);
for(int i = 0 ; i < len ; i ++)
{
int f1 = (i << 1) & i;
int f2 = (i << 2) & i;
if(!f1 && !f2)
{
flag[i] = 1;
int k = i;
while(k)
{
num[cnt] ++;
k -= k & -k;
}
can[cnt++] = i;
}
}
}
signed main(){
scanf("%d%d" , &n , &m);
init();
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++)
{
char c;
cin >> c;
if(c == 'P')
{
mp[i][j] = 1;
}
}
}
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 0 ; j < cnt ; j ++)
{
int f = 1 , l = 1 , s = can[j];
while(s)
{
if((s & 1) && (mp[i][l] == 0))
{
f = 0;
break;
}
s >>= 1;
l ++;
}
if(f)
{
fmap[i][j] = 1;
}
}
}
int maxx = -1;
for(int i = 0 ; i < cnt ; i ++)
{
if(fmap[1][i])
{
for(int j = 0 ; j < cnt ; j ++)
{
dp[1][i][j] = num[i];
maxx = max(maxx , num[i]);
}
}
}
for(int i = 0 ; i < cnt ; i ++)
{
if(fmap[2][i])
{
for(int j = 0 ; j < cnt ; j ++)
{
if((can[i] & can[j]) == 0)
{
int kk = dp[2][i][j] = num[i] + dp[1][j][j];
maxx = max(maxx , kk);
}
}
}
}
for(int k = 3 ; k <= n ; k ++)
{
for(int i = 0 ; i < cnt ; i ++)
{
if(fmap[k][i])
{
for(int i1 = 0 ; i1 < cnt ; i1 ++)
{
int nn = 0;
if((can[i] & can[i1]) == 0)
{
for(int i2 = 0 ; i2 < cnt ; i2 ++)
{
if(((can[i] & can[i2]) == 0) && (can[i1] & can[i2] == 0))
{
nn = max(nn , num[i] + dp[k - 1][i1][i2]);
}
}
}
dp[k][i][i1] = nn;
maxx = max(maxx , nn);
}
}
}
}
printf("%d" , maxx);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...