第二道DP 全WA...... HELP!
查看原帖
第二道DP 全WA...... HELP!
205782
R浩轩泽Anmicius楼主2020/7/26 17:10

代码如下:

#include<iostream>
#include<cstring>
using std::cin;
using std::cout;
#define N 13
#define mod 100000000
#define reint register int
int n,m,num,fields[N],f[N][1<<N],status[1<<N],ans;
inline bool checks(int x)
{
	if(x&(x<<1)||x&(x>>1))return false;
	return true;
}
inline bool grows(int a,int b)//a 该行土地情况 b 目前种植状态 
{
	while(a&&b)
	{
		if((!(a&1))&&(b&1))return false;
		a>>=1;b>>=1;
	} 
	return true;
}
inline void starts()
{
	memset(fields,0,sizeof(fields));
	memset(f,0,sizeof(f));
	memset(status,0,sizeof(status));
}
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>n>>m;
	starts();
	for(reint i=1;i<=n;++i)
	for(reint j=1;j<=m;++j)
	{
		bool g;
		cin>>g;
		fields[i]+=(g<<(m-j));
	}
	int full=(1<<n)-1;
	for(reint i=0;i<=full;++i)
	if(checks(i))status[++num]=i;
	for(reint i=1;i<=num;++i)//边界条件 
	{
		if(!grows(fields[1],status[i]))continue;
		f[1][status[i]]=1;
	}
	for(reint i=2;i<=n;++i)
	for(reint j=1;j<=num;++j)
	for(reint h=1;h<=num;++h)//上一行方案数 
	{
		int x=status[j],y=status[h];
		if(!grows(fields[i],x)||(x&y))continue;
		f[i][x]+=f[i-1][y];
	}
	for(reint i=1;i<=num;++i)ans+=f[n][status[i]];
	cout<<ans<<'\n';
	return 0;
}

求解

2020/7/26 17:10
加载中...