萌新刚刚学状压过不了样例求助
查看原帖
萌新刚刚学状压过不了样例求助
593595
_Aurore_楼主2022/10/21 13:22
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} 
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
} 
int n,m,a[101];
int peo[1<<10],dp[1<<10][1<<10][3];
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++){
	    	char ch;cin>>ch;
	    	if(ch=='H')
	    	    a[i]=a[i]*2+1;
	    	else
	    	    a[i]=a[i]*2;
    }
	for(int i=0;i<(1<<m);i++){
		int x=i;
		while(x){
			if(x&1)
			    peo[i]++;
			x>>=1;
		}
	}
	for(int i=0;i<(1<<m);i++)
	    if(!(i&a[1])&&!(i&(i<<1))&&!(i&(i<<2)))
	        dp[0][i][0]=peo[i];
	for(int i=0;i<(1<<m);i++)
	    if(!(i&a[1])&&!(i&(i<<1))&&!(i&(i<<2)))
	        for(int j=0;j<(1<<m);j++)
	            if(!(j&a[2])&&!(j&(j<<1))&&!(j&(j<<2))&&!(i&j))
	                dp[i][j][1]=peo[i]+peo[j];
	int now=1;
	for(int i=3;i<=n;i++){
		now=(now==2)?0:now+1;
		for(int j=0;j<(1<<m);j++)
		    if(!(j&a[i-1])&&!(j&(j<<1))&&!(j&(j<<2)))
		        for(int k=0;k<(1<<m);k++)
		            if(!(k&a[i])&&!(k&(k<<1))&&!(k&(k<<2))&&!(j&k))
		                for(int l=0;l<(1<<m);l++)
		                    if(!(l&j)&&!(l&k)&&!(l&&a[i-2])&&!(l&(l<<1))&&!(l&(l<<2)))
		                        dp[j][k][now]=max(dp[j][k][now],dp[l][j][(!now)?2:now-1]+peo[k]);
	}
	int ans=0;
	for(int i=0;i<(1<<m);i++)
	    if(!(i&&a[n-1])&&!(i&(i<<1))&&!(i&(i<<2)))
	        for(int j=0;j<(1<<m);j++)
	            if(!(i&j)&&!(j&a[n])&&!(j&(j<<1))&&!(j&(j<<2)))
	                ans=max(ans,dp[i][j][now]);
	cout<<ans;
	return 0;
} 
2022/10/21 13:22
加载中...