状压dp WA40pts求调
  • 板块学术版
  • 楼主Deerfall0625
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/25 15:48
  • 上次更新2023/11/3 07:43:14
查看原帖
状压dp WA40pts求调
679128
Deerfall0625楼主2023/7/25 15:48

题目link

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1e2 + 10;
const int MAXM = (1<<10) + 10;
int dp[MAXM][MAXM][3],a[MAXN],sum[MAXM];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char x;
			scanf(" %c",&x);
			a[i]<<=1;
			a[i]+=(x=='H'?1:0);
		}
	}
	for(int i=0;i<(1<<m);i++){
		int j=i,tot=0;
		while(j>0){
			if(j&1) tot++;
			j>>=1;
		}
		sum[i]=tot;
	}
	for(int s=0;s<(1<<m);s++){
		if(!(s&a[0]||(s&(s<<1))||(s&(s<<2)))){
			dp[0][s][0]=sum[s];
		}
	}	
	for(int l=0;l<(1<<m);l++){
		for(int s=0;s<(1<<m);s++){
			if(!(l&s||l&a[0]||s&a[1]||(l&(l<<1))||(l&(l<<2))||(s&(s<<1))||(s&(s<<2)))){
				dp[l][s][1]=sum[s]+sum[l];
			}
		}
	}	
	for(int i=2;i<n;i++){
		for(int l=0;l<(1<<m);l++){
			if(l&a[i-1]||(l&(l<<1))||(l&(l<<2))) continue;
			for(int s=0;s<(1<<m);s++){
				if(s&a[i]||l&s||(s&(s<<1))||(s&(s<<2))) continue;
				for(int r=0;r<(1<<m);r++){
					if(r&l||r&s||r&a[i-2]||(r&(r<<1))||(r&(r<<2)))	continue;
					dp[l][s][i%3]=max(dp[l][s][i%3],dp[r][l][(i-1)%3]+sum[s]);
				}
			}
		}
	}
	int ans=0;
	for(int l=0;l<(1<<m);l++){
		for(int s=0;s<(1<<m);s++){
			ans=max(ans,dp[l][s][(n-1)%3]);
		}
	}	
	printf("%d",ans);
	return 0;
}
2023/7/25 15:48
加载中...