【[USACO08NOV]奶牛混合起来Mixed Up Cows】
首先我们能够一眼看到4 <= N <= 16,那么就是它了,我们要压缩的状态就是它了
那么之后能我们用这个状态表示什么呢,我们要表示的显然是每只奶牛是否在队伍中
比如说10吧,转成二进制后就是1010,这就代表了第一只和第三只奶牛已经在队伍中,而第二只和第四只还没有在队伍中
那么就有一些状态可以初始化了,对于那些只有一只奶牛在队伍中,即某个状态转为二进制后只有一个1的状态我们就可以初始化为1
但是我们要判断的是这个队伍是否“混乱”,混乱的定义是:相邻奶牛的编号之差均超过K,于是我们在由一个状态得到一个新状态时一定要去判断这个原状态加上那个我们新添加到队伍末尾的那只奶牛后是否还是混乱的
那么我们要怎么做呢
显然我们的dp数组里存的不止是状态了,还应该存一个能帮助我们判断的东西
那就想想我们一旦新在队伍末尾加入一个奶牛后是怎么判断的呢
很显然只要新加入的这只奶牛和原本队尾那只奶牛的编号差大于k就可以使队伍继续混乱下去了,因为我们必须保证那个原来的状态是合法的,也就是说原来的那个队伍是混乱的
于是我们的dp数组就呼之欲出了
我们设 f[i][j]表示以第i只奶牛为结尾的状态为j的队伍混乱的方案数是多少
而我们怎么转移状态呢,我们知道对于每一个状态都有很多结尾,于是我们用两个循环,一个枚举状态,一个枚举结尾的奶牛
当然我们还需要判断这个情况是否存在,比如说f[2][10]吧,它表示10这个状态也就是1010,以第二只奶牛为结尾的方案数,这种情况显然是不存在的,因为在1010这个状态中第二只奶牛根本没有被选择,根本不可能成为结尾,所以对于这种情况我们需要进行判断
在最后我们统计答案的时候要把枚举各种奶牛作为结尾且所有奶牛均被选择的情况
于是就很简单了
之后就是代码了
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define int long long
#define maxn 17
using namespace std;
int k;
int n,a[maxn],f[maxn][1<<maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
signed main()
{
n=read();
k=read();
for(re int i=1;i<=n;i++)
a[i]=read();
for(re int i=1;i<=n;i++)
f[i][1<<(n-i)]=1;
for(re int i=1;i<(1<<n);i++)//枚举状态
for(re int j=1;j<=n;j++)//枚举结尾奶牛
{
if(f[j][i]) continue;
if(!(i&(1<<(n-j)))) continue;
//判断这种情况是否存在
int m=i^(1<<(n-j));
//得到一个没有选择当前结尾奶牛j的状态
for(re int g=1;g<=n;g++)
//枚举这个状态m的结尾
{
if(g==j) continue;
if(a[j]-a[g]>k||a[g]-a[j]>k) f[j][i]+=f[g][m];
//符合混乱的条件,进行转移
}
}
int ans=0;
for(re int i=1;i<=n;i++)
ans+=f[i][(1<<n)-1];
cout<<ans<<endl;
return 0;
}
【[USACO08NOV]奶牛混合起来Mixed Up Cows】的更多相关文章
- 洛谷 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 & ...
- [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 & ...
- 【题解】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= ...
随机推荐
- bzoj 3512: DZY Loves Math IV
Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1} ...
- Grunt:任务自动管理工具(收藏+转载)
原文:http://javascript.ruanyifeng.com/tool/grunt.html 安装 命令脚本文件Gruntfile.js Gruntfile.js实例:grunt-contr ...
- WPF 资源字典
使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源;修改一个地方所有引用的地方都会被修改,方便统一风格; 使用方法,归纳起来主要有下 ...
- Struts2 学习(三)
一.访问Servlet API 的三种方式 1.什么是 Action 访问 Servlet 的 API 1.访问 Servlet 的API: 1.获取 request 对象. 2.接受请求参数. 3. ...
- docker 数据卷挂载总结
原文
- JRebel&XRebel
介绍==>>>> JRebel&XRebel官网 https://zeroturnaround.com/HotSwap和JRebel原理 http://www.holl ...
- unity3d之技能栏冷却
绑定在按钮上的脚本 using UnityEngine; using System.Collections; using UnityEngine.UI; public class CdCover : ...
- JS里的居民们6-数组排序
编码 var arr = [43, 54, 4, -4, 84, 100, 58, 27, 140]; 将上面数组分别按从大到小以及从小到大进行排序后在console中输出 var arr = ['a ...
- timestamp to time 时间戳转日期
function timestampToTime(timestamp) { var date = new Date(timestamp * 1000); //timestamp 为10位需*100 ...
- [转]webapi部署在IIS7.5报404的解决方案
1.iis 目录权限设置 2.转自:http://www.cnblogs.com/youlies/p/6042169.html 在web.config添加如下节点 <system.webServ ...