题目链接: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 + 滚动数组的更多相关文章

  1. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 -- 状压DP

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MB Description 混乱的奶牛 [Don Pi ...

  2. bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛(状压dp)

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 588[ ...

  3. bzoj[Usaco2008 Nov]mixup2 混乱的奶牛 状压dp

    [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1204  Solved: 698[Submit ...

  4. B1231 [Usaco2008 Nov]mixup2 混乱的奶牛 状压dp

    发现是状压dp,但是还是不会...之前都白学了,本蒟蒻怎么这么菜,怎么都学不会啊... 其实我位运算基础太差了,所以状压学的不好. 题干: Description 混乱的奶牛 [Don Piele, ...

  5. bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231 小型状压DP: f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数: 所以 ...

  6. BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp

    开始读错题了,然后发现一眼切~ Code: #include <cstdio> #include <algorithm> #define ll long long #defin ...

  7. BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛( dp )

    状压dp dp( x , S ) 表示最后一个是 x , 当前选的奶牛集合为 S , 则状态转移方程 : dp( x , S ) =  Σ dp( i , S - { i } )  ( i ∈ S , ...

  8. BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛

    Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S ...

  9. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛【状压dp】

    设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1<<(k-1)|i]+=f[j][i] #include<iostream> #include< ...

随机推荐

  1. js 保留两位小数 javascript

    alert((0.9996*100).toFixed(2)); 得到99.96,这是我想要的! 使用Number.toFixed()可以格式数字显示任意的小数位!

  2. C 共用体

    C 共用体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 定 ...

  3. 微信小程序实战 购物车功能

    代码地址如下:http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...

  4. Visual Studio 2015官方下载 秘钥破解

    微软刚刚为开发人员奉上了最新大礼Visual Studio 2015正式版.如果你是MSDN订阅用户,现在就可以去下载丰富的相关资源.如果你指向体验一把尝尝鲜,微软也是很慷慨的. Visual Stu ...

  5. windows下使用Eclipse编译执行MapReduce程序 Hadoop2.6.0/Ubuntu

    一.环境介绍 宿主机:windows8 虚拟机:Ubuntu14.04 hadoop2.6伪分布:搭建教程http://blog.csdn.net/gamer_gyt/article/details/ ...

  6. 添加w3c验证图片到网站

    1.在http://validator.w3.org/网站验证 2.添加验证通过后的代码至自己的网站 类似<p>    <a href="http://validator. ...

  7. 使用Chrome(PC)调试移动设备上的网页

    最早开始调试移动端网页时,本人都是采取PC上改几行代码,手机上刷新一下看效果这种笨方法来开发的,效率低而且容易让人抓狂.最近偶然发现原来可以使用PC上的浏览器来调试移动设备,不由得感叹相逢恨晚. 工具 ...

  8. java线程用法

    package com; public class Demo { public static void main(String[] args) { // TODO Auto-generated met ...

  9. 世界更清晰,搜狐新闻客户端集成HUAWEI HiAI 亮相荣耀Play发布会!

    ​​6月6日,搭载有“很吓人”技术的荣耀Play正式发布,来自各个领域的大咖纷纷为新机搭载的惊艳技术站台打call,其中,搜狐公司董事局主席兼首席执行官张朝阳揭秘:华为和搜狐新闻客户端在硬件AI方面做 ...

  10. ndk javah配置

    Location: C:\Program Files\Java\jdk1.6.0_25\bin\javah.exe Working Directory: ${project_loc} Argument ...