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 ...
随机推荐
- Scrapyd 的远程部署和监控
1. 安装Scrapyd sudo pip3.6 install scrapyd # 安装scrapyd服务 sudo pip3.6 install scrapyd-client # 安装scrapy ...
- Oracle SCN机制解析
SCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复.Data Guard.Streams复制.RAC节点间的同步等各个功能中起着重要作用.理解SCN的运作机制 ...
- kotlin函数api
原 Kotlin学习(4)Lambda 2017年09月26日 21:00:03 gwt0425 阅读数:551 记住Lambda的本质,还是一个对象.和JS,Python等不同的是,Kotlin ...
- 开启Centos系统的SSH服务
1.登录Centos6.4系统. ◆示例:使用root用户登录. 注:若为非root用户登录,输入执行某些命权限不够时需加sudo. 查看SSH是否安装. 2.◆输入命令:rpm -qa | grep ...
- 2.1、CDH 搭建Hadoop在安装(为Cloudera Manager配置存储库)
步骤1:为Cloudera Manager配置存储库 使用包管理工具安装Cloudera Manager yum 对于RHEL兼容系统, zypper对于SLES,和 apt-get对于Ubuntu. ...
- SO减单后MO分配给其他SO的问题修复
逻辑:MO取进FP系统之前,首先判断是否带有SO号+SO行号,如果带有SO号+SO行号,则判断此SO号和SO行号是否存在订单表中,如果不存在则表示此MO对应的订单已减单,此MO需要做过滤,并展现在报表 ...
- maven项目下出现java.lang.ClassNotFoundException: ContextLoader异常
原因:出现此异常是因为tomcat的webapp目录下没有lib文件. 解决方案: 1.右键点击项目--选择Properties选择Deployment Assembly,在右边点击Add按钮,在弹出 ...
- 【C++】正则表达式引擎学习心得
最近参照一些资料实现了一个非常简易的正则表达式引擎,支持基本的正则语法 | + * ()等. 实现思路是最基本的:正则式->AST->NFA->DFA. 以下是具体步骤: 一. 正则 ...
- windows(cr lf )转unix (lf)
- vue element-ui怎样提炼一个自己写的js当作公共js
vue element-ui怎样提炼一个自己写的js当作公共js请教一下各位大神,我刚刚触摸vue element-ui几天,写的一个清晰检索的input框,现在需当作项目公共的部分,可遭需的html ...