【ybt金牌导航1-2-6】【luogu P2467】地精部落
地精部落
题目链接:ybt金牌导航1-2-6 / luogu P2467
题目大意
有一个排列,要使得每个位置要么都比两边高,要么比两边低。
而且一定要以一高一低的方式排列。
两边的只用比旁边的那个高或低就可以。
给出排列的长度 n 和模数,要你求出排列的种数在模数取模意义下的值。
思路
我们考虑设 \(f_{i,j}\) 为前 \(i\) 个数的排列,最后一个数是高的,然后是 \(j\) 会有的方案数。
那我们可以发现有几个特点:
- 高低高低和低高低高这两种形状的类型种数都是相同的。
因为你可以把 \(a_1,b_1,a_2,b_2,a_3\) 看成 \(n-a_1+1,n-b_1+1,n-a_2+1,n-b_2+1,n-a_3+1\)。
那这个既是另一种类型了。 - 如果一个排列已经是满足的了,而且 \(i\) 和 \(i+1\) 不相邻。那我们可以把他们互换,还是合法的。就因为他们不相邻,那它们就算交换了,它们还是原来的高低状态,就没有问题。
那我们可以求以高结尾的方案数,然后再输出乘 \(2\) 即可。
那怎么求高结尾的呢?
考虑根据上面的特点搞转移方程。
\(f_{i,j}=f_{i,j-1}+f_{i-1,n-j+1}\)
为什么呢?
按相不相邻来分开,不相邻的就可以交换直接形成新的波动,那就是把 \(j\) 和 \(j-1\) 交换所能有的方案数,就是 \(f_{i,j-1}\)。
那我们考虑如果相邻,是怎么样的。
那它就变成了 前 \(i-1\) 个数的排列,\(j-1\) 是最后一个,且是山谷的情况。因为这样你就可以直接让 \(j+1\sim i-1\) 的区间的数都加一(因为是相对的关系,加了之后还是满足高低关系),然后再在最后的位置把 \(j\) 插进去。
那你由前面可以知道,你前面是山谷,那你要把山谷改成山峰,那第二位就要变成 \((i-1)-(j-1)+1\),即 \(i - j+1\)。那就可以从 \(f[i-1][i-j+1]\) 转移过来。
然后你就得到了转移方程。
当然,两个 \(3500\) 的数组会炸空间,那我们观察到 \(i\) 这一维只会涉及前面的那一个,那就可以用滚动数组解决空间问题。
代码
#include<cstdio>
using namespace std;
int n, p, f[3][4201], ans;
int main() {
scanf("%d %d", &n, &p);
f[2 & 1][2] = 1;//一开始最后为高的只有这一种,初始化
for (int i = 3; i <= n; i++)
for (int j = 1; j <= i; j++) {
f[i & 1][j] = (f[i & 1][j - 1] + f[(i - 1) & 1][i - j + 1]) % p;//dp
}
for (int i = 1; i <= n; i++)
ans = (ans + f[n & 1][i]) % p;//最后可能以不同的数字结束
printf("%d", (ans * 2) % p);
return 0;
}
【ybt金牌导航1-2-6】【luogu P2467】地精部落的更多相关文章
- 【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田
优美玉米 / 方伯伯的玉米田 题目链接:ybt金牌导航1-2-5 / luogu P3287 题目大意 有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长. 思路 ...
- 【ybt金牌导航1-2-4】免费馅饼
免费馅饼 题目链接:ybt金牌导航1-2-4 题目大意 有一个直线,在某一个时刻有一个馅饼会出现在一些位置,有它的价值. 一个人一开始可以站在直线的任意地方,然后他每个时刻可以不移动,或向任意一边移动 ...
- 【ybt金牌导航1-2-3】折线统计
折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...
- 洛谷 P2467 地精部落 解题报告
P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...
- 【题解】金牌导航-高斯消元/Luogu P3232 游走
题目描述: 详细分析: 我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号. 那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定 ...
- 洛谷 P2467 地精部落 题解
题面 好难啊好难啊好难啊~(以后再玩魔兽的时候绝对绝对虐死他) 做完后总结了一下思路; 首先推一下以下三条性质: 1.若两个 i 与 i+1 不相邻,那么我们直接交换这两个数字就可以组成一个新的数列 ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
- luogu P2467 [SDOI2010]地精部落
很有意思的dp计数题目. 思考一下发现开始时山峰和开始是山谷的方案数是相同的 所以我们只需要统计一个即可. 证明的话可以考虑对于任意一种开始时山峰的方案 每个数字变成n-a[i]+1 那么可以此方案还 ...
- Luogu P2467 [SDOI2010]地精部落 | 神奇的dp
题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...
随机推荐
- KeepAlive安装以及简单配置
操作系统:Centos7.3 一.依赖安装 首先安装相关依赖: yum install -y gcc openssl-devel popt-devel yum -y install libnl lib ...
- 基于Asp.Net Core 5.0依赖Quartz.Net框架编写的任务调度web管理平台
源码地址: https://github.com/246850/Calamus.TaskScheduler 演示地址:http://47.101.47.193:1063/ 1.Quartz.NET框架 ...
- JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- 入门OJ:扫雪
扫雪1 题目描述 大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出 ...
- python的Counter类
python的Counter类 Counter 集成于 dict 类,因此也可以使用字典的方法,此类返回一个以元素为 key .元素个数为 value 的 Counter 对象集合 from coll ...
- rbd-db数据迁移至外部数据库
部署外部数据库 安装Docker export VERSION=19.03 && curl -fsSL http://rainbond-pkg.oss-cn-shanghai.aliy ...
- 转 14 jmeter性能测试实战--数据库MySQL
14 jmeter性能测试实战--数据库MySQL 需求 测试用户表(对用户表select操作) 测试步骤 1.MySQL驱动下载并安装. 2.测试计划面板点击"浏览"按钮,将 ...
- python(pymysql操作数据库)
第一种方式 import pymysql # 打开数据库连接 db = pymysql.connect(host="192.168.88.11", user="root& ...
- grpc-metadata
https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md https://github.com/grpc/g ...
- (013)每日SQL学习:日期的各种计算
1.确定两个日期之间的工作日天数 --确定两个日期之间的工作日天数with x0 as (select to_date('2018-01-01','yyyy-mm-dd') as 日期 from du ...