求助一本通经典状压DP国王
  • 板块学术版
  • 楼主ZJAJOIer
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/3/18 21:19
  • 上次更新2023/11/5 01:54:58
查看原帖
求助一本通经典状压DP国王
315229
ZJAJOIer楼主2021/3/18 21:19

题目链接

RT,样例没过,只有9分。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=150;
ll f[11][N][101];
int s[N],num[N];
int n,kk,s0;
void Init()
{
	s0=0;
	memset(f,0,sizeof(f));
	for(int i=0;i<(1<<n);i++)
	{
		if(i&(i<<1))
			continue;
		int cnt=0;
		for(int j=0;j<n;j++)
		{
			if(i&(1<<j))
				cnt++;
		}
		s[++s0]=i;
		num[s0]=cnt;
	}
}
//f[i][j][k]表示前i行,一共放了k个国王,且第i行位j号状态的方案总数 
void Dp()
{
	f[0][1][0]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=s0;j++)
			for(int k=num[j];k<=kk;k++)
				for(int l=1;l<=s0;l++)
					if(!(s[l]&s[j])&&!(s[l]&(s[j]<<1))&&!s[l]&(s[j]>>1))
						f[i][j][k]+=f[i-1][l][k-num[j]];					
	ll ans=0;
	for(int j=1;j<=s0;j++)
		ans+=f[n][j][kk];
	cout<<ans<<endl;
}
int main()
{
	while(cin>>n>>kk)
	{
		Init();
		Dp();
	}
	return 0;
}

帮帮我吧。

2021/3/18 21:19
加载中...