洛谷 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 }