P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows相关的知识,希望对你有一定的参考价值。

题目描述

约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的。这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍。在一只混乱的队 伍中,相邻奶牛的编号之差均超过K。比如当K = 1时,1, 3, 5, 2, 6, 4就是一支混乱的队伍, 而1, 3, 6, 5, 2, 4不是,因为6和5只差1。请数一数,有多少种队形是混乱的呢?

状压Dp

 见代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,K,end,a[16];
 6 long long dp[16][1<<16],ans;
 7 int main() {
 8     /*
 9         dp[i][j]在j状态中,队尾为第i头牛的方案数。
10         考虑在对位后加入新牛。无后效性。 
11     */
12     scanf("%d%d",&n,&K),end=1<<n;
13     for(int i=0;i<n;i++) scanf("%d",&a[i]);
14     for(int i=0;i<n;i++) dp[i][1<<i]=1;
15     for(int i=0;i<end;i++) {//枚举状态 
16         for(int j=0;j<n;j++) if(i&(1<<j))//枚举以那头牛为队尾 
17         for(int k=0;k<n;k++) if(!(i&(1<<k)) && abs(a[j]-a[k])>K)//枚举新添入哪头牛 
18         dp[k][i|(1<<k)]+=dp[j][i];
19     }
20     for(int i=0;i<n;i++) ans+=dp[i][end-1];//全牛 
21     printf("%lld\n",ans);
22     return 0;
23 }

其实就是把搜索中的状态用很方便的形式保存了,以循环的形式实现

以上是关于P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows的主要内容,如果未能解决你的问题,请参考以下文章

题解 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

[USACO08NOV]奶牛混合起来Mixed Up Cows

[USACO08NOV]奶牛混合起来Mixed Up Cows