第一个点和第一个hack能过,别的WA
查看原帖
第一个点和第一个hack能过,别的WA
859192
DarrenTu楼主2025/2/7 11:31

#include<bits/stdc++.h>
using namespace std;
int dp[205][100][100];
int a[205];
int f[100];
int n,m,cnt=0,temp=0;
int num(int state)
{
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(state&1) cnt++;
		state>>=1;
	}
	return cnt;
}
int main()
{
	cin>>n>>m;
	int ans=0;
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=m;j++){
			char ch;
		    cin>>ch;
		    a[i]=a[i]<<1;
		    if(ch=='H') a[i]=a[i]|1;
		}
	}
	for(int state=0;state<(1<<m);state++)
	{
		if((((state<<1)&state)==0)&&(((state<<2)&state)==0)&&(((state>>1)&state)==0)&&(((state>>2)&state)==0))
		{
			f[cnt]=state;
			cnt++;
		}
	}
	for(int j=0;j<cnt;j++)
	{
		if((f[j]&a[1])==0)
		{
			dp[1][0][j]=max(dp[1][0][j],num(f[j]));
			ans=max(ans,dp[1][0][j]);
		}
	}
	for(int j=0;j<cnt;j++)
	{
		for(int k=0;k<cnt;k++)
		{
			if((f[j]&a[2])==0&&(f[k]&a[1])==0&&(f[j]&f[k])==0)
			{
				dp[2][k][j]=max(dp[2][k][j],dp[1][0][k]+num(f[j]));
				ans=max(ans,dp[2][k][j]);
			}
		}
	}
	for(int i=3;i<=n;i++)
	{
		for(int l=0;l<cnt;l++)
		{
			if(f[l]&a[i-2]) continue;
			for(int k=0;k<cnt;k++)
			{
				if((f[k]&a[i-1])||(f[k]&f[l])) continue;
				for(int j=0;j<cnt;j++)
				{
  				    if((f[j]&a[i])==0&&(f[j]&f[k])==0&&(f[l]&f[j])==0)
				    {
					    dp[i][k][j]=max(dp[i][k][j],dp[i-1][l][k]+1);
					    ans=max(ans,dp[i][k][j]);
				    }
			    }
		    }
		}
	}
	cout<<ans<<endl;
}

大佬们帮帮我!

2025/2/7 11:31
加载中...