洛谷 P2915 [USACO08NOV]Mixed Up Cows G(状压dp)

传送门


解题思路

和上一题相似,用dp[i][j]表示当前状态为i,刚刚放的是第j头奶牛的方案数。

其中i的二进制位表示第k位的奶牛到目前为止是否已经选择。

一开始初始化只有一头奶牛时方案数为1,然后枚举状态、上一个位置的奶牛、这一个位置的奶牛转移过来即可。

AC代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 long long dp[70000][20],a[25],ans;
 8 int n,kk;
 9 int main()
10 {
11     cin>>n>>kk;
12     for(int i=1;i<=n;i++){
13         cin>>a[i];
14     }
15     sort(a+1,a+n+1);
16     for(int i=1;i<=n;i++) dp[1<<(i-1)][i]=1;
17     for(int i=1;i<=(1<<n)-1;i++){
18         for(int j=1;j<=n;j++){
19             if(i&(1<<(j-1))){
20                 for(int k=1;k<=n;k++){
21                     if(!(i&(1<<(k-1)))) continue;
22                     if(abs(a[j]-a[k])<=kk) continue;
23                     dp[i][k]+=dp[i-(1<<(k-1))][j];
24                 } 
25             }
26         }
27     }
28     for(int i=1;i<=n;i++) ans+=dp[(1<<n)-1][i];
29     cout<<ans;
30     return 0;
31 }
原文地址:https://www.cnblogs.com/yinyuqin/p/14033563.html