关于状压DP
  • 板块学术版
  • 楼主_脑波_
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/3/30 13:51
  • 上次更新2023/11/5 01:22:43
查看原帖
关于状压DP
287411
_脑波_楼主2021/3/30 13:51

为什么这道题洛谷题目链接

在洛谷上可以AC啊

在ybt(信息学奥赛一本通)上只有70分ybt链接

代码如下

#include<cstdio>
#include<iostream>
#include<cmath>
#define sr scanf
#define sc printf
#define ll long long
const int N=13,M=1<<12+1;
using namespace std;
int n,k,fa[M],bh[M],ztcd;
ll ans;
ll dp[N][M][N];
void prepare(){
	for(int i=0;i<(1<<n);i=-~i){
		if(i&(i<<1))continue;
		fa[++ztcd]=i;
		int shu=i;
		while(shu)shu=shu&(shu-1),++bh[ztcd];
	}
}
int main(){
	sr("%d%d",&n,&k);
	prepare();
	for(int i=1;i<=ztcd;i=-~i){
		if(bh[i]<=k)dp[1][i][bh[i]]=1;
	}
	for(int i=2;i<=n;i=-~i){
		for(int j=1;j<=ztcd;j=-~j){
			for(int p=1;p<=ztcd;p=-~p){
				if(fa[p]&fa[j])continue;
				if((fa[p]<<1)&fa[j])continue;
				if(fa[p]&(fa[j]<<1))continue;
				for(int s=1;s<=k;s=-~s){
					if(bh[j]+s>k)break;
					dp[i][j][bh[j]+s]+=dp[i-1][p][s];
				}
			}
		}
	}
	for(int i=1;i<=n;i=-~i){
		for(int j=1;j<=ztcd;j=-~j){
			ans+=dp[i][j][k];
		}
	}
	sc("%lld",ans);
}
2021/3/30 13:51
加载中...