题目链接: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. apache TIME_WAIT解决办法

    最近发现apache与负载均衡器的的连接数过多,而且大部分都是TIME_WAIT,调整apache2.conf后也没效果,最后百度到如下解决方案 通过调整内核参数解决 vi /etc/sysctl.c ...

  2. centos6.5下载

    1.64位系统 http://mirrors.163.com/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso http://mirrors. ...

  3. 使用matlab进行mex编译时的路径问题mexopts

            matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我 ...

  4. mysql启动參数(/etc/my.cnf)具体解释汇总

    在linux以下的/etc/my.cnf的參数具体解释汇总 MYSQL–my.cnf配置中文具体解释 basedir = path   使用给定文件夹作为根文件夹(安装文件夹). character- ...

  5. How do you stop Ansible from creating .retry files in the home directory?

    There are two options that you can add to the [defaults] section of the ansible.cfg file that will c ...

  6. 导出txt格式的说明书

    /// <summary> /// 说明书 /// </summary> /// <returns></returns> public FileResu ...

  7. SPA路由机制详解(看不懂不要钱~~)

    前言 总所周知,随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式.而大型单页应用最显著特点之一就是采用的前端路由跳转子页面系统,通过改变页面的UR ...

  8. QTreeWidget 的用法

    Qt QTreeWidget 新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下: 添加代码 //test.h //在头文件里添 ...

  9. Synchronized修饰静态变量和普通变量的区别

    这里主要涉及到类对象(static方法),对象方法(非static方法) 我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例): ...

  10. 有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。 给定数组A及它的大小n,请返回最大差值。

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...