[USACO08NOV]奶牛混合起来Mixed Up Cows(状态压缩DP)
题目描述
Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i <= 25,000). The cows are so proud of it that each one now wears her number in a gangsta manner engraved
in large letters on a gold plate hung around her ample bovine neck.
Gangsta cows are rebellious and line up to be milked in an order called 'Mixed Up'. A cow order is 'Mixed Up' if the sequence of serial numbers formed by their milking line is such that the serial
numbers of every pair of consecutive cows in line differs by more than K (1 <= K <= 3400). For example, if N = 6 and K = 1 then 1, 3, 5, 2, 6, 4 is a 'Mixed Up' lineup but 1, 3, 6, 5, 2, 4 is not (since
the consecutive numbers 5 and 6 differ by 1).
How many different ways can N cows be Mixed Up?
For your first 10 submissions, you will be provided with the results of running your program on a part of the actual test data.
POINTS: 200
约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的。这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍。
在一只混乱的队 伍中,相邻奶牛的编号之差均超过K。比如当K = 1时,1, 3, 5, 2, 6, 4就是一支混乱的队伍, 而1, 3, 6, 5, 2, 4不是,因为6和5只差1。请数一数,有多少种队形是混乱的呢?
输入输出格式
输入格式:
Line 1: Two space-separated integers: N and K
- Lines 2..N+1: Line i+1 contains a single integer that is the serial number of cow i: S_i
输出格式:
- Line 1: A single integer that is the number of ways that N cows can be 'Mixed Up'. The answer is guaranteed to fit in a 64 bit integer.
输入输出样例
4 1
3
4
2
1
2
说明
The 2 possible Mixed Up arrangements are:
3 1 4 2
2 4 1 3
思路:
看到n的范围这么小就能猜到是状态压缩的动态规划。
设f[i][j]为j在二进制表示的那些牛中以第i只牛为尾合法的队形总数,则我们就可以得到动态转移方程f[i][j | (1 << p-1)] += f[i][j] ,其中f[i][j | (1 << p-1)] 为状态j加上(1 << p-1)这只牛后的状态。其中 1 <= p <= n。
该动态转移方程必须符合以下条件:
状态j中没有包括第p只牛,且abs(s[p]-s[i]) > k。
所以,我们枚举每一个状态,并且在每一个状态中枚举第每一只牛,看这只牛是否在该状态中,如果在,我们则在此情况下进一步枚举,看那一只牛不在当前状态里,找到不在当前状态中的牛之后就进行累加,即为:
f[没在当前状态中的牛的输入顺序编号][当前状态加上不在状态中的牛后的新状态] += f[当前状态的结尾牛输入顺序编号][当前状态];
初始化应该为f[i][1 << i] = 1, 因为,当队列中只有一只牛时最后一只牛的标号就是它本身且此情况上的子问题答案是1。
另外,这题因为答案大,所以要使用longlong,这里用到了条件编译,使得在任何平台下,该程序将不受longlon影响。
下面贴代码,有问题留言。
#include<cstdio>
#define N 1 << 17
#define S 20
using namespace std; long long f[S][N];
int s[]; #ifdef WIN32 //条件编译,省去longlong给程序带来的影响
#define LL "%I64d\n"
#else
#define LL "%lld\n"
#endif int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i = ; i <= n; i++)scanf("%d",&s[i]);
int mxx = ( << n)-;
for(int i = ; i <= n; i++)f[i][ << (i-)] = ;
for(int i = ; i <= mxx+;i++){ //枚举每一个状态
for(int j = ; j <= n; j++){
if(i & ( << j-)){ //第j只牛是否在状态i中
for(int p = ; p <= n; p++) //进一步枚举没有在状态i中的牛
if(!(i & ( << p-)) && (s[j]-s[p] > k || s[p]-s[j] > k)){ //如果k不在队列中且差值大于k
f[p][i | ( << p-)] += f[j][i];
}
}
}
}
long long ans = ;
for(int i = ; i <= n; i++)ans += f[i][mxx];
printf(LL,ans);
return ;
}
[USACO08NOV]奶牛混合起来Mixed Up Cows(状态压缩DP)的更多相关文章
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...
- 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...
- luogu P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...
- 【题解】Luogu2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的.这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍.在一只混乱的队 伍中,相邻奶牛的编号之差均 ...
- 洛谷 P2915 【[USACO08NOV]奶牛混合起来Mixed Up Cows】
类似于n皇后的思想,只要把dfs表示放置情况的数字压缩成一个整数,就能实现记忆化搜索了. 一些有关集合的操作: {i}在集合S内:S&(1<<i)==1: 将{i}加入集合S:S= ...
- 【[USACO08NOV]奶牛混合起来Mixed Up Cows】
首先我们能够一眼看到4 <= N <= 16,那么就是它了,我们要压缩的状态就是它了 那么之后能我们用这个状态表示什么呢,我们要表示的显然是每只奶牛是否在队伍中 比如说10吧,转成二进制后 ...
随机推荐
- eclipse实现批量修改文件的编码方式
http://blog.csdn.net/haorengoodman/article/details/38493007 在eclipse+MyEclipse环境下,打开一个jsp文件,经常发现汉字无法 ...
- [bzoj2748][HAOI2012]音量调节_动态规划_背包dp
音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...
- HDU 5184
卡特兰数的一个变形而已. 一个经典的习题变过来的: n+m个人排队买票,并且满足,票价为50元,其中n个人各手持一张50元钞票,m个人各手持一张100元钞票,除此之外大家身上没有任何其他的钱币,并且初 ...
- POJ 1084
WA了好久,第一次用重覆盖的模型做题.感觉这题有个陷阱,那就是当去掉某些边后,若因为这个边去掉而被破环的正方形还存在,那么就会造成覆盖不完全,WA. 所以,在去掉边后,必定有些正方形是不存在的,须重新 ...
- HDU 3934
/*这是用的有旋转卡壳的思想. 首先确定i,j,对k进行循环,知道找到第一个k使得cross(i,j,k)>cross(i,j,k+1),如果k==i进入下一次循环. 对j,k进行旋转,每次循环 ...
- Java中的事务
Java中的事务 学习了:https://www.cnblogs.com/chengpeng15/p/5802930.html 膜拜一下 org 分为三类:jdbc事务.jta事务.容器事务:
- 支持中文的基于词为基本粒度的前缀树(prefix trie)python实现
Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频) ...
- BZOJ 4517: [Sdoi2016]排列计数 错排+逆元
4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i, ...
- 国外物联网平台初探(六) ——Electric Imp
公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投.Rampart资本.Redpoint创投 定位 Ele ...
- iOS10 推送通知详解(UserNotifications)
iOS10新增加了一个UserNotificationKit(用户通知框架)来整合通知相关的API,UserNotificationKit框架增加了很多令人惊喜的特性: 更加丰富的推送内容:现在可以设 ...