怎么一直T啊
查看原帖
怎么一直T啊
763878
Jerry_heng楼主2023/11/17 22:53
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,dp[3][1024][1024],s[2010];
void getsum(int x){
	int y=x;
	while(x){
		s[y]+=x&1;
		x>>=1;
	}
}
int a[110];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			char ch;
			cin>>ch;
			a[i]+=(ch=='H')*(1<<(j-1));
		}
	for(int i=0;i<(1<<m);i++)getsum(i);
	for(int i=0;i<(1<<m);i++){
		bool pd=0;
		if(a[1]&i)continue;
		for(int j=1;j<=m;j++){
			if(!((i>>(j-1))&1))continue;
			pd|=(i>>(j-2))&1;
			pd|=(i>>(j-3))&1;
		}
		if(!pd)dp[0][0][i]=s[i];
	}
	for(int i=0;i<(1<<m);i++)
		for(int k=0;k<(1<<m);k++){
		bool pd=0;
		if(a[2]&i)continue;
		for(int j=1;j<=m;j++){
			if(!((i>>(j-1))&1))continue;
			pd|=(k>>(j-1))&1;
			pd|=(i>>(j-2))&1;
			pd|=(i>>(j-3))&1;
		}
		if(!pd)dp[1][k][i]=dp[0][0][k]+s[i];
	}
	for(int i=3;i<=n;i++)
		for(int j=0;j<(1<<m);j++){
			if(a[i]&j)continue;
			bool pd=0;
			for(int k=1;k<=m;k++){
				if(!((j>>(k-1))&1))continue;
				pd|=(j>>(k-2))&1;
				pd|=(j>>(k-3))&1;
				if(pd)break;
			}
			if(pd)continue;
			for(int l1=0;l1<(1<<m);l1++)
				for(int l2=0;l2<(1<<m);l2++){
					pd=0;
					for(int k=1;k<=m;k++){
						if(!((j>>(k-1))&1))continue;
						pd|=(l1>>(k-1))&1;
						pd|=(l2>>(k-1))&1;
						if(pd)break;
					}
					if(!pd)dp[(i-1)%3][l2][j]=max(dp[(i-1)%3][l2][j],s[j]+dp[(i-2)%3][l1][l2]);
				}
		}
	for(int i=0;i<(1<<m);i++)
		for(int j=0;j<(1<<m);j++)
			ans=max(ans,dp[(n-1)%3][i][j]);
	cout<<ans;
	return 0;
}
2023/11/17 22:53
加载中...