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