萌新刚学状压dp,求教一道水题
  • 板块灌水区
  • 楼主Malody
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/5/29 21:09
  • 上次更新2023/11/7 01:30:03
查看原帖
萌新刚学状压dp,求教一道水题
334548
Malody楼主2020/5/29 21:09

https://www.luogu.com.cn/problem/P1896

我这题代码写的很乱,思路也乱,因此查了半天也没看出错哪,还越改越错。。。

代码求调

#include<bits/stdc++.h>
using namespace std;
int n,k,r,s[6000];
int N;
int a[6000];
int dp[10][15000][80];
int one(int x)
{
    int cnt=0;
    while(x)
    {
    	x&=x-1;
		cnt++;
    }
    return cnt;
}
int main()
{
	cin>>n>>k;
	N=(1<<n)-1;
	for(int i=0;i<=N;i++)
	{
		if(i&(i<<1))continue;
		a[++r]=i;
		s[r]=one(a[r]);
		if(s[r]<=k)
			dp[1][i][s[r]]=1;
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=r;j++)
		{
			if(s[j]>k)continue;
			for(int k=1;k<=r;k++)
			{
				if(s[j]+s[k]>k)continue;
				if(a[j]&a[k])continue;
				if(a[j]&(a[k]<<1))continue;
				if(a[j]&(a[k]>>1))continue;
				dp[i][a[k]][s[j]+s[k]]+=dp[i-1][a[j]][s[j]];
			}
		}
	}
	int sum=0;
	for(int j=1;j<=r;j++)					
		sum+=dp[n][a[j]][k];
	cout<<sum;
	return 0;
}

2020/5/29 21:09
加载中...