BZOJ1925或洛谷2467 [SDOI2010]地精部落
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]\)
解释下这个转移方程。
- 若\(j\)与\(j - 1\)不相邻,那么产生的方案数就是\(f[i][j - 1]\)。
因为当\(j - 1\)为首位且为山峰,那么\(j\)显然不可能和它相邻,即不可能在次位,否则\(j\)就成山谷了,所以根据性质\(1\),\(j - 1\)在首位的方案数即是\(j\)在首位且与\(j - 1\)不相邻的方案数。 - 若\(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]地精部落的更多相关文章
- 洛谷 P2467 [SDOI2010]地精部落
洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...
- 洛咕 P2467 [SDOI2010]地精部落
同波浪,简单dp. 高度从1到n插入山脉,设f[i][j][k]表示插入了i个山脉,组成了j段,边界上有k个山脉的方案数. 那么新插入的山脉只会:插入在边界上且自己是一段.插入在边界上且与最左边的段相 ...
- Luogu 2467[SDOI2010]地精部落 - DP
Solution 这题真秒啊,我眼瞎没有看到这是个排列 很显然, 有一条性质: 第一个是山峰 和 第一个是山谷的情况是一一对应的, 只需要把每个数 $x$ 变成 $n-x+1$ 然后窝萌定义数组 $ ...
- Luogu 2467 [SDOI2010]地精部落
挺有意思的题. 优质题解: https://www.luogu.org/blog/user55639/solution-p2467 题意为求长度为n,取值为$[1, n]$的波动序列的个数. 首先需要 ...
- 【BZOJ1925】[SDOI2010]地精部落(动态规划)
[BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...
- 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP
[BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...
- BZOJ 1925: [Sdoi2010]地精部落( dp )
dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...
- BZOJ_1925_[Sdoi2010]地精部落_递推
BZOJ_1925_[Sdoi2010]地精部落_递推 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 ...
- 1925: [Sdoi2010]地精部落
1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1929 Solved: 1227 [Submit][Statu ...
随机推荐
- 升级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.*版本的文件分别覆 ...
- python遇到的错误
今天学习文件遇到这个错误. 这是在 text_files\vvvv.txt 之间加一个\ 就可以了,变成 text_files\\vvvv.txt,运行成功
- QPS/TPS/并发量/系统吞吐量的概念
我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大.这个问题从业务上来讲,可以理解为应用系统每秒钟最大能接受的用户访问量.或者每秒钟最大能处理的请求数: QPS ...
- IronPython 的几个问题
1.在脚本中使用datagridview.Rows[i].Cells[1].Value并将其转换为string时,遇到int类型 有时可是直接使用.toString()转换为字符 有时必须采用str( ...
- java学习笔记整理
java知识模块:1.基础知识,数组,字符串,正则表达式:2.类和对象,接口,继承,多态,抽象类,内部类,泛型,java常用类库.3.异常处理: 4.IO: 5.事件处理: 6.多线程: 7 ...
- centos7.2 增加3T的XFS模式分区
parted -l 查看分区情况与要分区的设备 # parted /dev/sda #选定要操作的硬盘 此时命令提示符会变成(parted) (par ...
- EM算法之GMM聚类
以下为GMM聚类程序 import pandas as pd import matplotlib.pyplot as plt import numpy as np data=pd.read_csv(' ...
- 8. String to Integer (整数的溢出)
Implement atoi to convert a string to an integer. If no valid conversion could be performed, a zero ...
- Stealth潜行风格游戏源码(Unity5x)
官方的Stealth画质看起来不错.Unity 官方说Stealth样例属于中等难度,通过学习Stealth,可以获得: Create a fully functioning level of a ...
- Balanced Numbers (数位DP)
Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...