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. 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.

    先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...

  2. python遇到的错误

    今天学习文件遇到这个错误. 这是在 text_files\vvvv.txt  之间加一个\ 就可以了,变成  text_files\\vvvv.txt,运行成功

  3. QPS/TPS/并发量/系统吞吐量的概念

    我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大.这个问题从业务上来讲,可以理解为应用系统每秒钟最大能接受的用户访问量.或者每秒钟最大能处理的请求数: QPS ...

  4. IronPython 的几个问题

    1.在脚本中使用datagridview.Rows[i].Cells[1].Value并将其转换为string时,遇到int类型 有时可是直接使用.toString()转换为字符 有时必须采用str( ...

  5. java学习笔记整理

    java知识模块:1.基础知识,数组,字符串,正则表达式:2.类和对象,接口,继承,多态,抽象类,内部类,泛型,java常用类库.3.异常处理: 4.IO:   5.事件处理:   6.多线程:  7 ...

  6. centos7.2 增加3T的XFS模式分区

    parted -l 查看分区情况与要分区的设备 # parted /dev/sda                   #选定要操作的硬盘     此时命令提示符会变成(parted)    (par ...

  7. EM算法之GMM聚类

    以下为GMM聚类程序 import pandas as pd import matplotlib.pyplot as plt import numpy as np data=pd.read_csv(' ...

  8. 8. String to Integer (整数的溢出)

    Implement atoi to convert a string to an integer. If no valid conversion could be performed, a zero ...

  9. Stealth潜行风格游戏源码(Unity5x)

    官方的Stealth画质看起来不错.Unity 官方说Stealth样例属于中等难度,通过学习Stealth,可以获得:   Create a fully functioning level of a ...

  10. Balanced Numbers (数位DP)

    Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...