【USACO08NOV】奶牛混合起来Mixed Up Cows
2017-06-13 16:20
621 查看
题目描述
约翰有 N 头奶牛,第 i 头奶牛的编号是 S i ,每头奶牛的编号都不同。这些奶牛最近在闹脾气,为表达不满的情绪,她们在排队的时候一定要排成混乱的队伍。如果一只队伍里所有位置相邻的奶牛
的编号之差都大于 K,那么这就是一只混乱的队伍,其中 K 是一个给定的整数。比如说,当 K = 2
时,序列 (1,3,5,2,6,4) 就是一支混乱的队伍,而 (1,3,6,5,2,4) 不是,因为 6 和 5 只差 1,不够混
乱。请问,这 N 头奶牛可以排成多少种混乱的队形呢?
输入
• 第一行:两个整数 N 和 K,4 ≤ N ≤ 16, 1 ≤ K ≤ 3400• 第二行到第 N + 1 行:第 i + 1 行有一个整数 S i ,1 ≤ S i ≤ 25000
输出
• 单个整数:表示混乱队伍的数量样例输入
4 1 3 4 2 1样例输出
2提示
两种排法是 3,1,4,2 和 2,4,1,3题解:
乱搞搞对的,不知对不对,看到n<=16 于是想到状压
F[i][j] 表示以i结尾,状态为j的方案数
然后就是如果满足 S[i]-S[k]>p 就F[i][j]+=F[k][j-(1<<(i-1))]
注意开long long
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=17; int a ;long long F [1<<N]; int main() { int n,p; scanf("%d%d",&n,&p); for(int i=1;i<=n;i++)scanf("%d",&a[i]),F[i][(1<<(i-1))]=1; sort(a+1,a+n+1); int m=(1<<n)-1; for(int j=1;j<=m;j++) { for(int i=1;i<=n;i++) { if(!(j&(1<<(i-1))))continue; for(int k=1;k<=n;k++) { if(abs(a[i]-a[k])<=p)continue; if(!(j&(1<<(k-1))))continue; F[i][j]+=F[k][j-(1<<(i-1))]; } } } long long ans=0; for(int i=1;i<=n;i++)ans+=F[i][m]; printf("%lld",ans); return 0; }
相关文章推荐
- 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- luogu P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- [USACO08NOV]奶牛混合起来Mixed Up Cows
- [luoguP2915] [USACO08NOV]奶牛混合起来Mixed Up Cows(DP)
- 洛谷2915 usaco08nov 奶牛混合起来 Mixed Up Cows
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- bzoj1231[USACO 2008 Nov]Mixed Up Cows混乱的奶牛
- P2915 [USACO08NOV]奶牛混合起来(状压dp入门)
- [USACO08NOV]奶牛混合起来--状态压缩
- [USACO08NOV]Mixed Up Cows
- 3386/1752: [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
- USACO 2008 Nov Gold 1.Mixed Up Cows
- [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
- 题解:cheering up the cows[USACO2008 NOV]
- [Poj 2387][Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
- 【USACO 2008 Nov Gold】 1.Mixed Up Cows 状压DP、
- [USACO08NOV]Cheering up the Cow
- bzoj 3386: [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家