这个题的dp真的恶心。首先,一开始我以为是一道数论题,但是组合数和这个题没啥关系。dp方程巨麻烦,状态是dp[i][j][0/1],代表i位连了j个,上一位是否连着。然后开始转移,证明如下:

我们先来分析i-1,i相邻,也就是f[i][j][1]怎么推。
对于i,i-1,i-2,有这几种关系,
本来i-1与i-2相邻,将i插入两者中,拆了一对(i-1,i-2),又形成了一对(i-1,i),这样方案来源于f[i-1][j][1]。
本来i-1与i-2相邻,将i插入与i-1相邻却不被i-1与i-2夹着,多形成了一对(i-1,i),这样方案来源于f[i-1][j-1][1]。
本来i-1与i-2不相邻,将i插入与i-1相邻,形成了一对(i-1,i),这样方案来源于f[i-1][j-1][1],由于i-1的左右够可以插,方案就乘2。
这样f[i][j][1]=f[i−1][j−1][1]+f[i−1][j][1]+f[i−1][j−1][0]∗2

关于i-1,i不相邻,也就是f[i][j][0]怎么推
本来i-1与i-2相邻,将i插入j对相邻的数的任意一对,这样就破坏了一对,这样方案来源于f[i-1][j+1][1],有(j+1-1)种位置可以选(i-1与i-2那对不能拆,因为插入又会形成新的)。
本来i-1与i-2不相邻,将i插入j对相邻的数的任意一对,这样就破坏了一对,这样方案来源于f[i-1][j+1][0],有(j+1)种位置可以选。
又可能i不去拆开相邻的数,就可以来源于
f[i-1][j][1]*(i-j-1)(可以插入i-1与i-2,不改变对数) 或 f[i-1][j][0]*(i-j-2)
综合

f[i][j][0]=f[i−1][j+1][1]∗j+f[i−1][j+1][0]∗(j+1)+f[i−1][j][1]∗(i−j−1)+f[i−1][j][0]∗(i−j−2)

很难推的题呀。。。。

题干:

Description
n 个沙茶,被编号 ~n。排完队之后,每个沙茶希望,自己的相邻的两
人只要无一个人的编号和自己的编号相差为 (+ 或-)就行;
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。 Input
只有一行且为用空格隔开的一个正整数 N,其中 %的数据满足 ≤N ≤ ; Output
一个非负整数,表示方案数对 取模。 Sample Input Sample Output 样例解释:有两种方案 和
HINT Source

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
const int mod = ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
ll dp[][][];
int main()
{
int n;
read(n);
dp[][][] = ;
duke(i,,n)
{
duke(j,,i)
{
dp[i][j][] = (dp[i - ][j - ][] + dp[i - ][j][] + dp[i - ][j - ][] * ) % mod;
dp[i][j][] = (dp[i - ][j][] * (i - j - ) + dp[i - ][j + ][] * j + dp[i - ][j + ][] * (j + ) + dp[i - ][j][] * (i - j - )) % mod;
}
}
printf("%lld\n",dp[n][][]);
return ;
}

B4321 queue2 dp的更多相关文章

  1. BZOJ 4321: queue2( dp )

    dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...

  2. 【bzoj4321】queue2 dp

    题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行:  现在想知道,存在多少方案满足沙茶们如此不苛刻的条件.  ...

  3. #6【bzoj4321】queue2 dp

    题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行:  现在想知道,存在多少方案满足沙茶们如此不苛刻的条件.  ...

  4. BZOJ4321:queue2(DP)

    Description n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行.现在想知道,存在多少方案满足沙茶们如此不苛刻 ...

  5. bzoj4321: queue2(DP)

    woc万能的OEIS大法!这题居然是有递推式的QAQ http://oeis.org/A002464 这题的状态想不出来T^T... f[i][j][0/1]表示前i个编号,有j对相邻的编号位置上相邻 ...

  6. SRM 510 2 250TheAlmostLuckyNumbersDivTwo(数位dp)

    SRM 510 2 250TheAlmostLuckyNumbersDivTwo Problem Statement John and Brus believe that the digits 4 a ...

  7. BZOJ 4321 queue2

    4321: queue2 Description n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在 ...

  8. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  9. jzoj3454 表白(love)解题报告(01分数规划+DP)

    题目链接:https://jzoj.net/senior/#contest/show/2414/2 题目描述: 鸡腿是CZYZ的著名DS,但是不想追妹子的DS不是好GFS,所以鸡腿想通过表白来达到他追 ...

随机推荐

  1. 【PostgreSQL-9.6.3】触发器概述(普通触发器)

    一个触发器声明了当执行一种特定类型的操作时数据库应该自动执行一个特殊的函数.触发器可以被附加到表.视图和外部表.触发器经常用于做完整性约束,或者某种业务规则的约束. 1. 触发器的创建语法如下: CR ...

  2. eas之列表界面写脚本时如何写sql

    var easNames = JavaImporter();easNames.importPackage(Packages.com.kingdee.bos.dao.query);with(easNam ...

  3. 16.1 foreach 循环中捕获变量的变化

    在 foreach 循环内的匿名函数(通常为Lambda表达式)中捕获循环 变量时要格外小心.代码清单16-1就展示了这样一个简单的示例,它看上去似乎会输出 x . y . z . string[] ...

  4. 有赞 MySQL 自动化运维之路 — ZanDB

    转自:https://tech.youzan.com/youzan-mysql-auto-ops-road/ 一.前言 在互联网时代,业务规模常常出现爆发式的增长.快速的实例交付,数据库优化以及备份管 ...

  5. 【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise

    1.Promise的基本使用 // 需求分析: 封装一个方法用于读取文件路径,返回文件内容 const fs = require('fs'); const path = require('path') ...

  6. 【JAVA】AES加密

    import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; imp ...

  7. Spring Web MVC处理流程

    Spring Web MVC 处理流程: 1.浏览器向Spring发出请求,请求交给前端控制器 DispatcherServlet处理 2.控制器通过HandlerMapping找到相应的Contro ...

  8. Centos 7 关闭firewall防火墙启用iptables防火墙

    一.关闭firewall防火墙 1.停止firewall systemctl stop firewalld.service 2.禁止firewall开机启动 systemctl disable fir ...

  9. JavaScript学习笔记之DOM介绍

    目录 1.简介 2.方法 3.属性 4.访问节点 5.修改节点 6.添加节点 7.删除节点 8.替换节点 9.改变 CSS 1.简介 文档对象模型(Document Object Model,DOM) ...

  10. Python 元组和列表

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...