状压DP,玄学WA
查看原帖
状压DP,玄学WA
228843
wangjinbo楼主2020/5/31 10:40

RT,本地AC,评测90分WA样例,在线IDE也是WA

样例本地输出6,在线IDE输出7

#include<bits/stdc++.h>
using namespace std;
char s[101][11];
int a[101];
long long dp[3][1024][1024];
int sum[1024];
int getsum(int x)
{
	int cnt=0;
	while(x){
		x-=x&(-x);
		cnt++;
	}
	return cnt;
}
int main()
{
	for(int i=0;i<1024;i++)
	sum[i]=getsum(i);
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
    {
    	getchar();
    	for(int j=1;j<=m;j++)
    	{
    		scanf("%c",&s[i][j]);
    		a[i]*=2;
    		if(s[i][j]=='H')a[i]++;
		}
	}
	for(int u=0;u<(1<<m);u++)
	{
		if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
		dp[1][u][0]=sum[u];
	}
	for(int u=0;u<(1<<m);u++)
	{
		if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
		for(int v=0;v<(1<<m);v++)
		{
		    if((v&a[2])||(v&(v<<1))||v&(v<<2)||(v&u))continue;
		    dp[2][v][u]=sum[v]+sum[u];
		}
	}
	for(int i=3;i<=n;i++)
	{
		for(int u=0;u<(1<<m);u++)
		{
			if((u&a[i])||(u&(u<<1))||(u&(u<<2)))continue;
			for(int v=0;v<(1<<m);v++)
			{
				if((v&a[i-1])||(v&(v<<1))||(v&(v<<2))||(v&u))continue;
				for(int w=0;w<(1<<m);w++)
				{
					if((w&a[i-2])||(w&(w<<1))||(w&(w<<2))||(w&v)||(w&u))continue;
					dp[i%3][u][v]=max(dp[i%3][u][v],dp[(i-1)%3][v][w]+sum[u]);
				}
			}
		}
	}
	long long ans=0;
	for(int u=0;u<(1<<m);u++)
	for(int v=0;v<(1<<m);v++)
	ans=max(ans,dp[n%3][u][v]);
	printf("%lld\n",ans);
	return 0;
}
2020/5/31 10:40
加载中...