社区讨论

MLE30求条

P2704[NOI2001] 炮兵阵地参与者 5已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mlhcfm2j
此快照首次捕获于
2026/02/11 09:20
上周
此快照最后确认于
2026/02/12 19:40
7 天前
查看原帖
CPP
#include<bits/stdc++.h>
#define I_don_t_want_to_AFO int main()
#define I_want_to_study_OI_forever return 0;
using namespace std;
int n,m;
int v[105];
int f[103][1<<10][1<<10],cnt[1<<10];
/*
f[i][j][k]表示前i行i状态为j,i-1状态为 k
f[0][0][0]=1;

f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+cnt[i]);
1.jk不同,kl不同,jl不同
2.i,j,k在v内 
*/
int su(int x){
	int sum=0;
	while(x){
		sum+=x&1;
		x=x>>1;
	}
	return sum;
}
bool check(int i){
	return ((i&(i>>1))==0)&&((i&(i>>2))==0);
}
I_don_t_want_to_AFO{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++){
			char p;
			cin>>p; 
			v[i]+=((p=='P'?1:0)<<j);
		}
	}
	for(int i=0;i<(1<<m);i++){
		cnt[i]=su(i);
	}
	f[0][0][0]=0;
	for(int i=1;i<=n+2;i++){
		for(int j=0;j<(1<<m);j++){
			if((j&v[i])!=j)continue; 
			if(!check(j))continue;
			for(int k=0;k<(1<<m);k++){
				if((k&v[i-1])!=k)continue; 
				if(!check(k))continue;
				for(int l=0;l<(1<<m);l++){
					if((l&v[i-2])!=l)continue; 
					if((j&k)||(j&l)||(k&l))continue;
					if(!check(l))continue;
					f[i][j][k]=f[i-1][k][l]+cnt[j];
				}
			}
		}
	}
	cout<<f[n+2][0][0];
	I_want_to_study_OI_forever
}


rt,提交记录如下 https://www.luogu.com.cn/record/262429885

回复

11 条回复,欢迎继续交流。

正在加载回复...