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< ...
随机推荐
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 本章节你将学到: SP中工作流的新功能: 理解工作流管理服务 ...
- 应该知道的Linux技巧(转载)
这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>—— Linux用户 ...
- 【Python】随机漫步
创建Randomwalk()类 我们将使用Python来生成随机漫步数据,再使用matplotlib以引入瞩目的方式将这些数据呈现出来 首先创建类Randomwalk() from random im ...
- SpringMVC:前台jsp页面和后台传值
前台jsp页面和后台传值的几种方式: 不用SpringMVC自带的标签 前台---->后台,通过表单传递数据(): 1.jsp页面代码如下, modelattribute 有没有都行 < ...
- Bootstrap学习速查表(一) 理论基础
参考网站http://www.bootcss.com/ 第一步,起步,引入基本样式 <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="st ...
- CSS3 实现背景透明,文字不透明,兼容所有浏览器
<!DOCTYPE html><html><head><meta charset="utf-8"><title>opac ...
- IPv4地址(一)概述
IPv4地址的长度是多少? IPv4地址是如何表示的? IPv4地址的构成以及每一部分所起到的作用和占的位数特点? IPv4地址长度为32位. IPv4地址分为两部分:网络号和主机号 网络号部分惟一地 ...
- android 编译问题解决
1.android4.2.2 '/root/origin_android/mokesoures/out/target/common/obj/APPS/ApplicationsProvider_inte ...
- erlang的undefined macro 'MODULE',头一行编译通不过的问题
前言:对于erlang的编译有很多方式,rebar,makefile文件 还是对于单个文件的erlc编译等,但不管何种方式,一个模块的第一行就编译不过去,实在让人纠结... 1)问题上述: 在技术交流 ...
- rpm包查看和解压(转)
From:http://www.51testing.com/html/57/28557-205195.html 查看rpm包内容: rpm -qpl *.rpm 解压rpm包: rpm2cpio *. ...