萌新求助
查看原帖
萌新求助
239192
淸梣ling楼主2021/7/3 17:14

本人写的是状压,先枚举可能结果,然后在用滚动数组dp但是 WAWA 了7个点,恳请各位 DalaoDalao 查查错

#include<iostream>
#include<cstdio>
using namespace std;

struct node
{
	long long k;
	int num;
}str[1100];
int num;
int n,m,ans;
long long a[200];
int f[1100][1100][2];

void init(int k,long long a,int sum)
{
	if(k>=m)
	 str[++num]=(node){a,sum};
	else
	{
		init(k+1,a,sum);
		init(k+3,a+(1ll<<k),sum+1);
	}
}
void nextline()
{
	char ch;
	while(ch=getchar(), ch=='\n'||ch=='\r');
}
int main()
{
	int i,j,k,q;
	char c;
	
	cin>>n>>m;nextline();
	init(0,0,0);
	for(i=1;i<=n;i++)
	{
		for(j=0;j<m;j++)
		{
			c=getchar();
			if(c=='H')
			a[i]+=1ll<<j;
		}
		nextline();
	}
	
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=num;j++)
		if(!(a[i]&str[j].k))
		{
			for(k=1;k<=num;k++)
			if(!(a[i-1]&str[k].k))
			if(!(str[j].k&str[k].k))
			{
				for(q=1;q<=num;q++)
				if(i<2||!(a[i-2]&str[q].k))
				if(!(str[j].k&str[q].k)&&!(str[k].k&str[q].k))
				{
					f[k][j][i%2]=max(f[k][j][i%2],f[q][k][(i-1)%2]+str[j].num);
					if(i==n)ans=max(ans,f[k][j][i%2]);
				}
			}
		}
	}
	cout<<ans;
	getchar();
	return 0;
}
2021/7/3 17:14
加载中...