题目描述

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

输入

只有一行且为用空格隔开的一个正整数 N,其中 100%的数据满足 1≤N ≤ 1000; 

输出

一个非负整数,表示方案数对 7777777 取模。   

样例输入

4

样例输出

2


题解

dp

老套路了,考虑把数从小到大插入的过程进行dp。

设 $f[i][j]$ 表示 $1\sim i$ 的排列,有 $j$ 组相邻的相差1,且 $i$ 和 $i-1$ 不相邻的方案数;
设 $g[i][j]$ 表示 $1\sim i$ 的排列,有 $j$ 组相邻的相差1,且 $i$ 和 $i-1$ 相邻的方案数。

那么考虑插入 $i+1$ 的位置,有:不破坏空位且不与 $i$ 相邻、不破坏空位且与 $i$ 相邻、破坏空位且不与 $i$ 相邻、破坏空位且与 $i$ 相邻(只发生在 $g$ 的转移)4种。分别推一下方案数即可。

最后的答案就是 $f[n][0]$ 。

时间复杂度 $O(n^2)$ 。

另外把前几项丢到oeis上可以得到线性递推式 $a_n=(n+1)a_{n-1}-(n-2)a_{n-2}-(n-5)a_{n-3}+(n-3)a_{n-4}$ ,就能 $O(n)$ 求解了,感觉像是某容斥然而并不能推出来...

#include <cstdio>
#define mod 7777777
long long f[1010][1010] , g[1010][1010];
int main()
{
int n , i , j;
scanf("%d" , &n);
f[1][0] = 1;
for(i = 1 ; i < n ; i ++ )
{
for(j = 0 ; j < i ; j ++ )
{
f[i + 1][j] = (f[i + 1][j] + f[i][j] * (i - j - 1)) % mod;
g[i + 1][j + 1] = (g[i + 1][j + 1] + f[i][j] * 2) % mod;
if(j) f[i + 1][j - 1] = (f[i + 1][j - 1] + f[i][j] * j) % mod;
f[i + 1][j] = (f[i + 1][j] + g[i][j] * (i - j)) % mod;
g[i + 1][j + 1] = (g[i + 1][j + 1] + g[i][j]) % mod;
if(j) f[i + 1][j - 1] = (f[i + 1][j - 1] + g[i][j] * (j - 1)) % mod;
g[i + 1][j] = (g[i + 1][j] + g[i][j]) % mod;
}
}
printf("%lld\n" , f[n][0]);
return 0;
}

【bzoj4321】queue2 dp的更多相关文章

  1. #6【bzoj4321】queue2 dp

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

  2. LG4719 【模板】动态dp 及 LG4751 动态dp【加强版】

    题意 题目描述 给定一棵\(n\)个点的树,点带点权. 有\(m\)次操作,每次操作给定\(x,y\),表示修改点\(x\)的权值为\(y\). 你需要在每次操作之后求出这棵树的最大权独立集的权值大小 ...

  3. 【专题】数位DP

    [资料] ★记忆化搜索:数位dp总结 之 从入门到模板 by wust_wenhao 论文:浅谈数位类统计问题 数位计数问题解法研究 [记忆化搜索] 数位:数字从低位到高位依次为0~len-1. 高位 ...

  4. 洛谷P4719 【模板】"动态 DP"&动态树分治

    [模板]"动态 DP"&动态树分治 第一道动态\(DP\)的题,只会用树剖来做,全局平衡二叉树什么的就以后再学吧 所谓动态\(DP\),就是在原本的\(DP\)求解的问题上 ...

  5. LG5056 【模板】插头dp

    题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...

  6. 【专题】区间dp

    1.[nyoj737]石子合并 传送门:点击打开链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这 ...

  7. 【BZOJ4976】宝石镶嵌 DP

    [BZOJ4976]宝石镶嵌 Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升法杖的威力.不幸的是,小Q的法 ...

  8. NOJ 1111 保险箱的密码 【大红】 [区间dp]

    传送门 保险箱的密码 [大红] 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 118            测 ...

  9. 【CF480D】Parcels DP

    [CF480D]Parcels 题意:有一个栈,有n个物品,每个物品可以选或不选.如果选了第i个物品,则获得$v_i$的收益,且第i个物品必须在$in_i$时刻入栈,$out_i$时刻出栈.每个物品还 ...

随机推荐

  1. 成都Uber优步司机奖励政策(4月12日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 【BZOJ3489】A simple rmq problem

    [BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...

  3. cogs1533 [HNOI2002]营业额统计

    cogs1533 [HNOI2002]营业额统计 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 和上一篇博文完全一样2333 另外 ...

  4. linux挂在samba服务器到本地(用于备份文件到nas或者windows的文件服务器)

    1.安装工具 首先在linux上安装samba访问工具 sudo apt-get install smbclient sudo apt-get install cifs-utils 2.查看服务器目录 ...

  5. Angular开发者手册重点翻译之指令(一)

    创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的标记(例如一个属性,一个节点名,注释或者CSS ...

  6. C#之Lambda不得不说的用法

    由于我才开始接触代码的时候遇到循环问题都是用foreach和for,慢慢就成了习惯,不愿意用其他简便的方式,偶然发现lambda能代替循环而且简便了很多.当然我用lambda也不是简便,更多是不用不行 ...

  7. 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...

  8. sublime3配置java开发环境

    链接:http://www.jianshu.com/p/48a524a4f63c 或者:http://www.jianshu.com/p/9d167c4c4feb 侵权删!

  9. Cesium开发添加entity无法显示

    无代码报错,js查询entity数量发现确实添加进去了.但是在底图上就是不显示. 有可能是跨域产生的问题.打开开发者工具Console栏.查看是不是存在跨域错误. 解决跨域后entity正常加载.

  10. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...