30分 求助 不加longlong40分
查看原帖
30分 求助 不加longlong40分
180059
return_dirt楼主2020/11/4 15:35

改到最后几乎和2018-11-14 20:12:22的那篇题解一样了

然而只有30分 只能过前三个点

无法理解

#include <algorithm>
#include <cstdio>
#define int long long
using namespace std;

int num[10];
int line[200];
int ans;

int n,K;
int dp[10][200][200];

int cnt;
int ycl(int x)
{
	cnt=0;
	for(int i=0;i<(1<<x);i++)
	{
		if( (i&(i<<1)) )continue;
		cnt++;
		int sum=0;
 		for(int j=0;j<n;++j)
 	   	if(i&(1<<j))++sum;
		num[cnt]=sum;
		line[cnt]=i;
	}
}

signed main()
{
	scanf("%lld%lld",&n,&K);
	ycl(n);
	dp[0][1][0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=cnt;j++)
		{
			for(int k=0;k<=K;k++)
			{
				if(k>=num[j])
				{
					for(int ls=1;ls<=cnt;ls++)
					{
						if(!(line[ls]&line[j])&&!(line[ls]&(line[j]<<1))&&!(line[ls]&(line[j]>>1)))
						{
							dp[i][j][k]+=dp[i-1][ls][k-num[j]];
//							printf("dp[%d][%d][%d]uped from dp[%d][%d][%d] to num%d king=%d\n",i,j,k,i-1,ls,k-num[j],dp[i][j][k],k+num[j]);
						}
					}
				}
			}
		}
	}
	for(int j=1;j<=cnt;j++)
	{
		ans+=dp[n][j][K];
	}
	printf("%lld",ans);
	return 0;
}
2020/11/4 15:35
加载中...