WA20pts #3~#10 hack#2WA悬关求条
查看原帖
WA20pts #3~#10 hack#2WA悬关求条
787031
UKE_Piu楼主2025/2/8 14:35

rt

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=110,V=1<<10;
int dp[2][V][V],cnt[N];
bool sta[V];
char mp[N][N];
int getsta(int x){
	int ret=0;
	for(int i=0;i<m;i++)
	  if(mp[x][i]=='H') ret|=(1<<i);
	return ret;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  for(int j=0;j<m;j++) scanf(" %c",&mp[i][j]);
	fill(sta,sta+(1<<m)+1,true);
	for(int S=0;S<(1<<m);S++)
	  for(int i=0;i<m;i++)
	    for(int j=0;j<m;j++){
	    	if(!(S&(1<<i))||!(S&(1<<j))||i==j) continue;
	    	if(abs(i-j)<=2) sta[S]=false;
		}
	for(int S=0;S<(1<<m);S++)
	  for(int i=0;i<m;i++)
		if(!(S&(1<<i))) cnt[S|(1<<i)]=cnt[S]+1;
		
	int op=0;
	for(int i=1;i<=n;i++){
		int hill=getsta(i);
		memset(dp[op^1],0,sizeof dp[op^1]);
		for(int S1=0;S1<(1<<m);S1++){
		  if(!sta[S1]) continue;
		  for(int S2=0;S2<(1<<m);S2++){
		  	if(!sta[S2]) continue;
		  	if(S1&S2) continue;
		  	for(int S=0;S<(1<<m);S++){
		  		if(!sta[S]) continue;
		  		if((S&S1)||(S&S2)) continue;
		  		if(S&hill) continue;
		  		dp[op^1][S2][S]=max(dp[op^1][S2][S],dp[op][S1][S2]+cnt[S]);
			  }
		  }
		}
		op^=1;
	}
	int ans=0;
	for(int S=0;S<(1<<m);S++)
	  for(int S1=0;S1<(1<<m);S1++)
	    if(sta[S]&&sta[S1])	ans=max(ans,dp[op][S][S1]);
	cout<<ans;
	return 0;
}
2025/2/8 14:35
加载中...