记录编号 |
543684 |
评测结果 |
AAAAAAAAAA |
题目名称 |
放国王 |
最终得分 |
100 |
用户昵称 |
瑆の時間~無盡輪迴·林蔭 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.001 s |
提交时间 |
2019-10-08 16:11:38 |
内存使用 |
2.25 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long int
int s[1<<10+1],c[1<<10+1],dp[11][1<<10+1][51];
int n,k;
void DFS(int H,int now,bool last,int cnt)
{
//DFS处理某一横行可能出现的所有情况
//H代表处理到第H位,now代表当前状态,last代表上一位的摆放状态
//cnt代表已放棋子数
if(H==n)
{
s[++s[0]]=now;
c[s[0]]=cnt;
return;
}
DFS(H+1,now*2,0,cnt);
if(!last)
DFS(H+1,now*2+1,1,cnt+1);
}
int LINYIN()
{
freopen("placeking.in","r",stdin);
freopen("placeking.out","w",stdout);
scanf("%lld%lld",&n,&k);
DFS(0,0,0,0);
dp[0][1][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=s[0];j++)
{
for(int sk=c[j];sk<=k;sk++)
{
for(int l=1;l<=s[0];l++)
{
if(c[j]+c[l]<=sk&&((s[j]&s[l])==0)&&((s[j]&(s[l]*2))==0)&&((s[j]&(s[l]/2))==0))
{
dp[i][j][sk]+=dp[i-1][l][sk-c[j]];
}
}
}
}
}
int ans=0;
for(int i=1;i<=s[0];i++)
{
ans+=dp[n][i][k];
}
printf("%lld",ans);
return 0;
}
int LWH=LINYIN();
signed main()
{
;
}