萌新求助入门状压dp
  • 板块学术版
  • 楼主Stars_never_set
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/2 21:49
  • 上次更新2023/11/3 06:15:30
查看原帖
萌新求助入门状压dp
929863
Stars_never_set楼主2023/8/2 21:49

题目:P1896 [SCOI2005] 互不侵犯

求助本题代码为什么会wa

#include<bits/stdc++.h>
using namespace std;

inline int read()
{
	int x=0,y=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-y;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^'0');c=getchar();}
	return x*y;
}

int n,m,f[10][100][100];
vector<int>vec;

int qiu(int k)
{
	int res=0;
	while(k)
	{
		if(k&1) res++;
		k>>=1;
	}
	return res;
}

void init()
{
	for(int i=0;i<1<<n;i++)
	{
		if(i&(i<<1)||i&(i>>1)) continue;
		f[1][i][qiu(i)]=i;
		vec.push_back(i);
	}
	return;
}

signed main()
{
	n=read(),m=read();
	init();
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<vec.size();j++)
		{
			int u=vec[j];
			for(int k=0;k<vec.size();k++)
			{
				int v=vec[k];
				if(u&v||u&(v<<1)||u&(v>>1)) continue;
				int uu=qiu(u);
				for(int l=qiu(v);l<=m;l++) f[i][j][l+uu]+=f[i-1][k][l];
			}
		}
	}
	int ans=0;
	for(int i=0;i<vec.size();i++) ans+=f[n][i][m];
	printf("%d\n",ans);
	return 0;
}
2023/8/2 21:49
加载中...