BZOJ原题链接

洛谷原题链接

先讲下关于波动数列的\(3\)个性质。

性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列。

性质\(2\):对于任何一个由\(1\sim n\)组成的波动数列,将每个数\(a_i\)变为\(n + 1 - a_i\),形成的依旧是波动数列,且山峰和山谷与原先的数列刚好相反。

性质\(3\):波动数列有对称性,即一个波动数列倒过来依旧是波动数列。

由性质\(3\),我们可以只考虑第一个数为山峰的情况,最后将答案\(\times 2\)即可(如果\(n = 1\)是需要特判的,但这题保证\(n \geqslant 3\),所以无所谓)。

设\(f[i][j]\)表示由\(1 \sim i\)组成、首位为\(j\)(且为山峰)的波动数列方案数。

则有状态转移方程:

\(\qquad\qquad f[i][j] = f[i][j - 1] + f[i - 1][i - j + 1]\)

解释下这个转移方程。

  1. 若\(j\)与\(j - 1\)不相邻,那么产生的方案数就是\(f[i][j - 1]\)。

    因为当\(j - 1\)为首位且为山峰,那么\(j\)显然不可能和它相邻,即不可能在次位,否则\(j\)就成山谷了,所以根据性质\(1\),\(j - 1\)在首位的方案数即是\(j\)在首位且与\(j - 1\)不相邻的方案数。
  2. 若\(j\)与\(j - 1\)相邻,那么产生的方案数就是\(f[i - 1][i - j + 1]\)。

    因为此时的数列是\(j,j - 1,\dots\)的形式,那么这时的方案数就相当于给你\([1,j - 1]\cup[j + 1, i]\)的数,求\(j - 1\)在首位且为山谷的方案数,由于我们在考虑的数的大小均是相对的,所以给你\([j +1,i]\)等同于给你\([j, i - 1]\)的数,所以就转换为由\(1 \sim i - 1\)组成的波动数列,求\(j - 1\)在首位且为山谷的方案数,根据性质\(2\),这个问题就等同于由\(1 \sim i - 1\)组成的波动数列,求\((i - 1) + 1 - (j - 1) = i - j + 1\)在首位且为山峰的方案数,即\(f[i - 1][i - j + 1]\)。

最后的答案即为\(2 \times \sum \limits _{i = 2} ^ n f[n][i]\),因为\(1\)在首位不可能为山峰,所以从\(2\)开始累计。

代码里我使用了滚动数组来缩小空间。

#include<cstdio>
using namespace std;
const int N = 4210;
int f[2][N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
int main()
{
int i, j, n, p, s = 0;
n = re();
p = re();
f[0][2] = 1;
for (i = 3; i <= n; i++)
for (j = 2; j <= i; j++)
f[i & 1][j] = (1LL * f[i & 1][j - 1] + f[(i & 1) ^ 1][i - j + 1]) % p;
for (i = 2; i <= n; i++)
s = (1LL * s + f[n & 1][i]) % p;
printf("%lld", 2LL * s % p);
return 0;
}

BZOJ1925或洛谷2467 [SDOI2010]地精部落的更多相关文章

  1. 洛谷 P2467 [SDOI2010]地精部落

    洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...

  2. 洛咕 P2467 [SDOI2010]地精部落

    同波浪,简单dp. 高度从1到n插入山脉,设f[i][j][k]表示插入了i个山脉,组成了j段,边界上有k个山脉的方案数. 那么新插入的山脉只会:插入在边界上且自己是一段.插入在边界上且与最左边的段相 ...

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

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

  4. Luogu 2467 [SDOI2010]地精部落

    挺有意思的题. 优质题解: https://www.luogu.org/blog/user55639/solution-p2467 题意为求长度为n,取值为$[1, n]$的波动序列的个数. 首先需要 ...

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

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

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

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

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

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

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

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

  9. 1925: [Sdoi2010]地精部落

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

随机推荐

  1. java 代码块,静态代码块,构造器等的执行顺序

    写了一段测试代码,如下: public class ExecutionSequence extends fatherClass{    static{        System.out.printl ...

  2. JMeter学习(二十一)关联(转载)

    转载自 http://www.cnblogs.com/yangxia-test 话说LoadRunner有的一些功能,比如:参数化.检查点.集合点.关联,Jmeter也都有这些功能,只是功能可能稍弱一 ...

  3. [Git] 获取指定的历史版本代码

    首先 ,把项目 clone 到其他文件夹下 git clone git@github.com:skyming/BMAdScrollView.git 然后查看指定历史版本 tree 的 SHA chec ...

  4. 高德地图开发者平台获取sHA1值

    一般在  Application 中进行初始化 /** * 获取高德SHA1值 * */ public static String sHA1(Context context) { try { Pack ...

  5. C++求图任意两点间的所有路径

    基于连通图,邻接矩阵实现的图,非递归实现. 算法思想: 设置两个标志位,①该顶点是否入栈,②与该顶点相邻的顶点是否已经访问. A 将始点标志位①置1,将其入栈 B 查看栈顶节点V在图中,有没有可以到达 ...

  6. Jmeter OutofMemory Error

    在给一个项目做稳定性测试中,也就是长时间运行jmeter,发现两个问题: 1,在聚合报告中,throuhtput随着时间的增加也减小,从80-50...很是迷惑. 2,在jmeter运行一段时间,大概 ...

  7. 《基于Nginx的中间件架构》学习笔记---2.nginx的优点以及nginx的安装

    [优势] 优势1:IO多路复用和epoll模型(详见总结知识) 优势2:轻量级(1.功能模块少:只保留了一些核心代码     2.代码模块化) 优势3:CPU亲和 这里的CPU亲和指的是:是一种把cp ...

  8. python中if not x: 和 if x is not None: 和 if not x is None的使用和区别

    代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if x is None`: 第二种是 `if not x:`: 第三种是`if not x is None`(这句这样理解更清晰 ...

  9. IntelliJ+Maven+Spring+Tomcat项目搭建(MAC)

    1.新建项目 打开idea,通过File->new->project,会弹出如下的信息: 接下来点击下一步,创建项目,点击“下一步”: 选择默认的Maven以及setting文件,点击“下 ...

  10. pycurl提示load dll failed 找不到注册程序

    原因:python虽然是2.7的 但有小版本区别 建议使用2.7.8