开O2还是T了一半的点,不知道是哪里写假了还是状压转移有问题,求大佬看看
查看原帖
开O2还是T了一半的点,不知道是哪里写假了还是状压转移有问题,求大佬看看
111349
bobzbh楼主2023/2/12 21:17
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define N 110
#define M 11
using namespace std;
int dp[N][(1<<M)-1][(1<<M)-1];
//表示行,状态,上一行状态 
int n,m,st,pic[N]; 
int cul[(1<<M)-1];
//预处理每个数的二进制下1的个数 
void init(int num)
{
	for(int i=1; i<=num; ++i)
	{
		int tot=0,state=i;
		while(state!=0)
		{
			if(state&1==1)
			{
				tot++;
			}
			state>>=1;
		}
		cul[i]=tot;
	}
}
int main()
{
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);
	cin>>n>>m;
	st=(1<<m)-1;//状态总数 
	init(st);
	for(int i=1; i<=n; ++i)
	{
		char row[M];
		int state=0;
		cin>>row;
		for(int j=0; j<m; ++j)
		{
			//将地形状态压缩成一个数字H是1,P是0 
			state<<=1;
			if(row[j]=='H')
			{
				state+=1;
			}
		}
		pic[i]=state;
	}
	int ans=0;
	for(int i=1; i<=n; ++i)//第和i行 
	{
		for(int j=0; j<=st; ++j)//当前行状态 
		{
			if((j&pic[i])==0&&(j&(j<<2))==0&&(j&(j<<1))==0)
			{
				for(int k=0; k<=st; ++k)//上一行状态 
				{
					for(int l=0; l<=st; ++l)//上上行状态 
					{
						if((k&j)==0&&(l&j)==0)
						{
							dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+cul[j]);
						}
					}
					if(i==n)
					{
						ans=max(ans,dp[i][j][k]);
					}
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
/*
1 1
P
*/
2023/2/12 21:17
加载中...