BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1231
题意:
给你n个数字s[i],问你有多少个排列,使得任意相邻两数字之差的绝对值大于m。
题解:
表示状态:
dp[i][j][state] = arrangements
i:考虑到第i个位置。
j:上一个数字是s[j]。(j = n表示没有上一个数字)
state:表示哪些数字已经被选过。
找出答案:
ans = ∑ dp[n][j][(1<<n)-1]
如何转移:
now: dp[i][j][state]
枚举第i个位置要放数字s[k]。
dp[i+1][k][state|(1<<k)] += dp[i][j][state]
转移条件:
(1)abs(s[j]-s[k])>m || j==n
与上一个数字之差的绝对值 > m,或没有上一个数字。
(2)!((state>>k)&1)
数字s[k]还没被选过。
边界条件:
dp[0][n][0] = 1
others = 0
优化:
因为dp要用long long存,空间正好爆了。。。
第一维改成滚动数组。
注意:当前为dp[i&1],要用dp[(i+1)&1],要把dp[(i+1)&1]全部设为0。
即:memset(dp[(i+1)&1],0,sizeof(dp[(i+1)&1]))
AC Code:
// state expression:
// dp[i][j][state] = arrangements
// i: considering ith pos
// j: last cow
// state: state of selection
//
// find the answer:
// sigma dp[n][j][(1<<n)-1]
//
// transferring:
// now: dp[i][j][state]
// dp[i+1][k][state|(1<<k)] += dp[i][j][state]
// abs(s[j]-s[k])>m || j==n
// !((state>>k)&1)
//
// boundary:
// dp[0][n][0] = 1
// others = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_N 17
#define MAX_S 65540 using namespace std; int n,m;
int s[MAX_N];
long long ans=;
long long dp[][MAX_N][MAX_S]; void read()
{
cin>>n>>m;
for(int i=;i<n;i++)
{
cin>>s[i];
}
} void solve()
{
memset(dp,,sizeof(dp));
dp[][n][]=;
for(int i=;i<n;i++)
{
memset(dp[(i+)&],,sizeof(dp[(i+)&]));
for(int j=;j<=n;j++)
{
for(int state=;state<(<<n);state++)
{
if(dp[i&][j][state])
{
for(int k=;k<n;k++)
{
if((abs(s[j]-s[k])>m || j==n) && !((state>>k)&))
{
dp[(i+)&][k][state|(<<k)]+=dp[i&][j][state];
}
}
}
}
}
}
for(int i=;i<n;i++)
{
ans+=dp[n&][i][(<<n)-];
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组的更多相关文章
- bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 -- 状压DP
1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MB Description 混乱的奶牛 [Don Pi ...
- bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛(状压dp)
1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1032 Solved: 588[ ...
- bzoj[Usaco2008 Nov]mixup2 混乱的奶牛 状压dp
[Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1204 Solved: 698[Submit ...
- B1231 [Usaco2008 Nov]mixup2 混乱的奶牛 状压dp
发现是状压dp,但是还是不会...之前都白学了,本蒟蒻怎么这么菜,怎么都学不会啊... 其实我位运算基础太差了,所以状压学的不好. 题干: Description 混乱的奶牛 [Don Piele, ...
- bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231 小型状压DP: f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数: 所以 ...
- BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp
开始读错题了,然后发现一眼切~ Code: #include <cstdio> #include <algorithm> #define ll long long #defin ...
- BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛( dp )
状压dp dp( x , S ) 表示最后一个是 x , 当前选的奶牛集合为 S , 则状态转移方程 : dp( x , S ) = Σ dp( i , S - { i } ) ( i ∈ S , ...
- BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛
Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S ...
- bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛【状压dp】
设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1<<(k-1)|i]+=f[j][i] #include<iostream> #include< ...
随机推荐
- leetcode 46-Permutations and 47-Permutations II
Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...
- 【阿里云】Windows2008 FTP配置指南
云服务器默认使用Windws 2008 IIS 中自带的FTP服务器. 1.添加FTP帐号 A. 选择[服务管理器]--[配置]--[本地用户和组]--[用户]:在空白处右键选择[新用户] ...
- 笔记本中LVDS屏与eDP屏的比较
LVDS,即Low Voltage Differential Signaling,是一种低压差分信号技术接口.它是美国NS公司(美国国家半导体公司)为克服以TTL电平方式传输宽带高码率数据时功耗大.E ...
- Spring里通过注解开启事物
方式1 <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://w ...
- linux查看某个时间段的log
若想在linux下查询某个时间段的log,用sed命令示例如下: $ sed -n '/2017-01-04 11:00:00/,/2017-01-04 11:20:55/p' ejabberd.l ...
- 在diy的文件系统上创建文件的流程
[0]README 0.1) source code are from orange's implemention of a os , and for complete code , please v ...
- Windows上搭建Kafka
搭建环境: 1,安装JDK JAVA_HOME: C:\Program Files (x86)\Java\jre1.8.0_60(这个是默认安装路径,如果安装过程中更改了安装目录,把更改后的路径填上就 ...
- python 基础 2.7 range与xrange的区别
#/usr/bin/python #coding=utf-8 #@Time :2017/10/25 19:22 #@Auther :liuzhenchuan #@File :range与xrange的 ...
- Mysql代码建外键问题
用下面代码建外键 运行之后 没有提示错误 但是打开建好的表格 外键并没有建立上 打开外键栏 里面并没有外键 在从表设置了外键列里面输入东西没有任何限制 成功建立应该是下面这样 什么情况???????? ...
- 【BZOJ2406】矩阵 二分+有上下界的可行流
[BZOJ2406]矩阵 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出最小的答案: ...