下载样例自己跑对了,洛谷上过不了
查看原帖
下载样例自己跑对了,洛谷上过不了
939326
tangfanhao楼主2024/10/4 16:32
#include<bits/stdc++.h>
using namespace std;
int sum[2005],a[105],v[105][105],tot[105],dp[105][105][105],n,m,ans;
int main(){
	n=0;
	m=0;
	scanf("%d%d",&n,&m);
	getchar();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char sl;
			sl=getchar();
			if(sl=='H'){
				a[i]=a[i] << 1;
				a[i]+=1;
			}else{
				a[i]=a[i] << 1;
			}
		}
		getchar();
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<(1 << m);j++){
			if(((j&a[i])==0)&&((j&(j << 1))==0)&&((j&(j << 2))==0)&&((j&(j >> 1))==0)&&((j&(j >> 2))==0)){
				v[i][++tot[i]]=j;
			}
			sum[j]=sum[j >> 1]+(j & 1);
		}
	}
	for(int i=1;i<=tot[1];i++){
		dp[1][i][0]=sum[v[1][i]];
	}
	for(int i=1;i<=tot[2];i++){
		for(int j=1;j<=tot[1];j++){
			if((v[2][i]&v[1][j])==0){
				dp[2][i][j]=sum[v[2][i]]+sum[v[1][j]];
			}
		}
	}
	if(n==1){
		for(int i=1;i<=tot[1];i++){
			ans=max(ans,dp[1][i][0]);
		}
		cout<<ans;
		return 0;
	}
	for(int i=3;i<=n;i++){
		for(int j=1;j<=tot[i];j++){
			int s=v[i][j];
			if((s&a[i])!=0){
				continue ;
			}
			for(int k=1;k<=tot[i-1];k++){
				int l=v[i-1][k];
				if((s & l)==0&&(l&a[i-1])==0){
					for(int op=1;op<=tot[i-2];op++){
						int ll=v[i-2][op];
						if((ll&a[i-2])==0&&(l & ll)==0&&(s & ll)==0){
							dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][op]+sum[s]);
						}
					}
				}
			}
		}
	}
	for(int j=1;j<=tot[n];j++){
		for(int k=1;k<=tot[n-1];k++){
			ans=max(ans,dp[n][j][k]);
		}
	}
	cout<<ans;
	return 0;
}

记录 wa#1,就是样例

2024/10/4 16:32
加载中...