骑士SGU223

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 typedef long long ll;
 5 #define debug(x) cout<<#x<<" = "<<x<<endl;
 6 const int maxn=1207;
 7 ll n,kk,s_num;
 8 ll ans=0,f[20][207][117];
 9 ll s[maxn],cnt[maxn];
10 void prepare(){
11     ll i,j,k;
12     for(i=0;i<(1<<n);i++){
13         k=0; 
14         if(i&(i<<1)) continue;
15         for(j=0;j<n;j++){
16             if(i&(1<<j)) k++;
17         }
18         s[++s_num]=i;
19         cnt[s_num]=k;
20     }
21 }
22 void process(){
23     f[0][1][0]=1;
24     for(int i=1;i<=n;i++){
25         for(int j=1;j<=s_num;j++){
26             for(int nu=0;nu<=kk;nu++){
27                 if(nu<cnt[j]) continue;
28                 for(int k=1;k<=s_num;k++){
29                     if((s[j]&s[k])||(s[j]&(s[k]<<1))||(s[j]&(s[k]>>1))) continue;
30                     f[i][j][nu]+=f[i-1][k][nu-cnt[j]];
31                 }
32             }
33         }
34     }
35     for(int i=1;i<=s_num;i++) ans+=f[n][i][kk]; 
36 }
37 int main(){
38     cin>>n>>kk;
39     prepare();
40     process();
41     cout<<ans<<endl;
42     return 0;
43 }

 这样差不多的题目还有牧场的安排,炮兵阵地啥的......

原文地址:https://www.cnblogs.com/lcan/p/9573773.html