挺有意思的题。

优质题解: https://www.luogu.org/blog/user55639/solution-p2467

题意为求长度为n,取值为$[1, n]$的波动序列的个数。

首先需要三个性质:

性质1:在一个波动序列中,如果数字$i$与数字$i - 1$不相邻,那么把$i$与$i - 1$交换之后也会构成一个波动序列

性质2:如果已经构造好了一个波动序列,那么把这个序列中的每一个数$a_{i}$全部变成$(n + 1 - a_{i})$也是一个波动序列,且山谷和山峰的位置相反

性质3:一个波动序列倒过来也是一个合法的波动序列

首先根据性质3,我们只要算出以山峰开头的波动序列的个数,然后乘以二就是最终的答案了。

我们设$f_{i, j}$表示选用区间$[1, i]$中的数,且数字$j$开头为山峰的方案数。

考虑转移:    $f_{i, j} = f_{i, j - 1} + f_{i - 1, i - j + 1}$ $(2\leq j\leq i )$

解释一下这个转移方程,由于性质1,当数字$j$与数字$j - 1$不相邻的时候,我们直接交换数字$j$和数字$j - 1$可以构造出合法的波动序列

考虑数字$j$与数字$j - 1$相邻的情况,这时候我们构造的序列相当于这样

$(j), (j - 1), ..., ..., ...$

因为$j$一定是一个山峰的位置,那么$j - 1$一定是一个山谷的位置,那么相当于我们要加上数字取值在$[1, j - 1] \cup [j + 1, i]$且以数字$j - 1$开头的山谷的数量

我们的状态设计并不能拆分区间,但是我们可以考虑把$[j + 1, i]$区间的数字全部都向左平移一位,这样并不会改变构造的波动序列的合法性

由于性质2,我们所求的这一段答案就是$f_{i - 1, (i - 1) + 1 - (j - 1) = i - j + 1}$。

考虑到1开头作山峰的时候没有合法的波动序列,所以初态从2开始。

滚掉第一维即可。

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

思维量和码量的差距还是很大的。

Code:

#include <cstdio>
using namespace std; const int N = ; int n, P, f[][N]; int main() {
scanf("%d%d", &n, &P);
f[][] = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= i; j++)
f[i & ][j] = (f[i & ][j - ] + f[(i - ) & ][i - j + ]) % P; int ans = ;
for(int i = ; i <= n; i++)
ans = (ans + f[n & ][i]) % P; printf("%d\n", ans * % P);
return ;
}

我真的不会数数呜呜呜……

Luogu 2467 [SDOI2010]地精部落的更多相关文章

  1. Luogu 2467[SDOI2010]地精部落 - DP

    Solution 这题真秒啊,我眼瞎没有看到这是个排列 很显然, 有一条性质: 第一个是山峰 和 第一个是山谷的情况是一一对应的, 只需要把每个数 $x$  变成 $n-x+1$ 然后窝萌定义数组 $ ...

  2. luogu P2467 [SDOI2010]地精部落

    很有意思的dp计数题目. 思考一下发现开始时山峰和开始是山谷的方案数是相同的 所以我们只需要统计一个即可. 证明的话可以考虑对于任意一种开始时山峰的方案 每个数字变成n-a[i]+1 那么可以此方案还 ...

  3. Luogu P2467 [SDOI2010]地精部落 | 神奇的dp

    题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...

  4. BZOJ1925或洛谷2467 [SDOI2010]地精部落

    BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...

  5. BZOJ 1925: [Sdoi2010]地精部落( dp )

    dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...

  6. BZOJ_1925_[Sdoi2010]地精部落_递推

    BZOJ_1925_[Sdoi2010]地精部落_递推 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 ...

  7. 【BZOJ1925】[SDOI2010]地精部落(动态规划)

    [BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...

  8. 1925: [Sdoi2010]地精部落

    1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1929 Solved: 1227 [Submit][Statu ...

  9. 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP

    [BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...

随机推荐

  1. java关键字---final和transient

    首先,说说final. final关键字可以修饰变量,方法,类.    final变量:         需求:             1 需要一个永不改变的编译时常量             2 ...

  2. RTP协议全解(H264码流和PS流)

    写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...

  3. JQuery 提供了两种方式来阻止事件冒泡。

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  4. UVA - 1602 Lattice Animals (暴力+同构判定)

    题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭.. ...

  5. [Wc2009]shortest

    传送门 终于把这题过了,了了我两年前写堵塞的交通一晚上无果的心结 因为是6要注意蛇皮走位啊!!这种-> S //Achen #include<bits/stdc++.h> #defi ...

  6. Oracle导出导入

    导出 exp 用户名/密码 file=文件名.dmp full=y; 导入 imp 用户名/密码 file=文件名.dmp full=y; 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP ...

  7. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  8. live555源码分析----RSTPServer创建过程分析

    最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考. 因为再读源码的过程中,并不是一路顺着读下来,往往 ...

  9. UML解析

    1.1 UML基础知识扫盲 UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言. 你可能会问:这明明是一种图形,为什 ...

  10. 转:利用UDEV服务解决RAC ASM存储设备名

    利用UDEV服务解决RAC ASM存储设备名 好文转载,链接:http://www.askmaclean.com/archives/utilize-udev-resolve-11gr2-rac-asm ...