社区讨论

10分求救

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

讨论操作

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

当前回复
17 条
当前快照
1 份
快照标识符
@lo7yuma9
此快照首次捕获于
2023/10/27 10:00
2 年前
此快照最后确认于
2023/10/27 10:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,s[105],ok[105],tot,dp[105][1<<11][1<<11],sum[1<<11],ans;
char p[105];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",p+1);
		for(int j=1;j<=m;j++)s[i]=s[i]<<1|(p[j]=='H'?1:0);
	}
	for(int i=0;i<=(1<<m)-1;i++){
		int t=i;
		while(t){
			if(t&1)sum[i]++;
			t>>=1;
		}
		if((!(i&(i<<1)&(i<<2)))&&(!(i&(i>>1)&(i>>2))))ok[++tot]=i;
	}
	for(int i=3;i<=n;i++){
		for(int j=0;j<=tot;j++){
			int state1=ok[j];//这行
			if(state1&s[i])continue;
			for(int k=0;k<=tot;k++){
				int state2=ok[k];//上行
				if(state2&s[i-1])continue;
				for(int l=0;l<=tot;l++){
					int state3=ok[l];//上上行
					if(state3&s[i-2])continue;
					if(state3&state2&state1)continue;
					dp[i][state1][state2]=max(dp[i][state1][state2],dp[i-1][state2][state3]+sum[state1]);
				}
			}
		}
	}
	for(int i=0;i<=tot;i++){
		for(int j=0;j<=tot;j++){
			if(ok[i]&s[n])continue;
			if(ok[j]&s[n-1])continue;
			if(ok[i]&ok[j])continue;
			ans=max(ans,dp[n][ok[i]][ok[j]]);
		}
	}
	printf("%d\n",ans);
	return 0;
}
调了好久了QwQ

回复

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

正在加载回复...