很有意思的dp计数题目。

思考一下发现开始时山峰和开始是山谷的方案数是相同的 所以我们只需要统计一个即可。

证明的话可以考虑对于任意一种开始时山峰的方案 每个数字变成n-a[i]+1 那么可以此方案还是一个排列 且变成开始时山谷的方案。

考虑统计一个 设f[i][j]表示到了第i个数字 此时放数集合为j的方案数。

n*2^n的复杂度当然过不了。之所以有这么高的复杂度 是因为数的集合一直放不下去。

只要我们考虑出和数的大小无关的状态就能降低复杂度。

强行考虑 f[i]表示i个数字所形成的第一个为山峰的方案数。

发现很难推到i+1因为我们的数的集合不知道 此时两种方法打表找规律(非常困难。

考虑递推关系是可行的 这个时候一个比较强大的转移是 我们发现i个数中存在最大值 我们以最大值为标准确定方案数。

最大值位置如果在i 那么我们要选出C(n-1,i-1)个数在左边 剩下的在右边 那么方案数就是 f[i-1]C(n-1,i-1)f[n-i];

这样我们枚举一个i就能推出方案数 原因是最大值在做分割的缘故。非常巧妙的dp。将数的集合强行放下。

关于组合数不能够预处理 但是可以发现我们逐次递推的时候推出组合数 滚动数组即可。

luogu上可以开二维数组 但bzoj上不行。。

const int MAXN=4210;
int n,mod;
ll f[MAXN],c[2][MAXN];
int main()
{
freopen("1.in","r",stdin);
f[0]=f[1]=1;
get(n);get(mod);
int u=0;
c[u][0]=1;
rep(2,n,i)
{
u=u^1;c[u][0]=1;
rep(1,i-1,j)c[u][j]=(c[u^1][j-1]+c[u^1][j])%mod;
for(int j=1;j<=i;j+=2)f[i]=(f[i]+f[j-1]*c[u][j-1]%mod*f[i-j])%mod;
}
printf("%lld\n",(f[n]<<1)%mod);
return 0;
}

再分享一个思路吧:

这是基于分析性质的来的:一个性质 如果j-1为开头 j-1和j不相邻 那么交换两个数字此时还是合法的序列。

所以设 f[i][j]表示前i个数字选择j为开头的方案数 有一个显然的转移 f[i][j]=f[i][j-1] 当然还要考虑一下j和j-1相邻的时候。

此时必须要把j-1紧贴j放 让剩下的i-1个数形成一个一个波动序列 但是j-1是山谷。

我们只求出了j-1是山峰的方案数 考虑j-1是山谷时的所有方案数 和i-1-(j-1)+1时山峰的方案数相同 所以此时有转移f[i][j]+=f[i-1][i-j+1];

发现便利了所有的情况 所以这种方法时正确的。 这个思路是基于仔细观察性质的得到了。

所以说性质也分好坏 一个好的性质可以帮助解题。

const int MAXN=4210;
int n,mod;
int ans,f[2][MAXN],u;
int main()
{
freopen("1.in","r",stdin);
n=read();mod=read();
if(n==1||n==2)
{
printf("%d\n",n);
return 0;
}
f[u][2]=1;
for(int i=3;i<=n;++i)
{
u=u^1;
for(int j=2;j<=i;++j)
f[u][j]=(f[u][j-1]+f[u^1][i-j+1])%mod;
}
for(int i=2;i<=n;++i)ans=(ans+f[u][i])%mod;
printf("%d\n",(ans<<1)%mod);
return 0;
}

luogu P2467 [SDOI2010]地精部落的更多相关文章

  1. Luogu P2467 [SDOI2010]地精部落 | 神奇的dp

    题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...

  2. 【ybt金牌导航1-2-6】【luogu P2467】地精部落

    地精部落 题目链接:ybt金牌导航1-2-6 / luogu P2467 题目大意 有一个排列,要使得每个位置要么都比两边高,要么比两边低. 而且一定要以一高一低的方式排列. 两边的只用比旁边的那个高 ...

  3. P2467 [SDOI2010]地精部落 DP

    传送门:https://www.luogu.org/problemnew/show/P2467 参考与学习:https://www.luogu.org/blog/user55639/solution- ...

  4. P2467 [SDOI2010]地精部落 (dp+组合数)【扩展Lucas好难不会】

    题目链接:传送门 题目: 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个独一无二的高度Hi,其 ...

  5. P2467 [SDOI2010]地精部落

    题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个独一无二的高度Hi,其中Hi是1到N之间的正整数 ...

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

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

  7. Luogu 2467 [SDOI2010]地精部落

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

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

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

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

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

随机推荐

  1. 如何使用JS操纵伪元素

    css引入伪类和伪元素概念是为了格式化文档树以外的信息.也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素. 伪类 用于当已有元素处于的某个状态时 ...

  2. 51Nod 1683 最短路

    题意 给定一个未知的\(0/1\)矩阵,对每个\(i\)求\((1,1)\sim(n,m)\)最短路为\(i\)的概率,在矩阵中不能向左走,路径长度为路径上权值为\(1\)的格子个数. \(n\leq ...

  3. 解决安装mysql 提示msvcr100.dill 丢失,的最快方法

    我也是在学习mysql的时候遇到的这个问题,很多人也遇到了,于是在百度找解决方案 看到有人论坛中写道,用 360安全卫士,可以修复于是我下载了360安全卫士尝试修复, 在人工解答中搜索dll修复,也修 ...

  4. 浏览器访问 www.baidu.com 的过程

    浏览器访问 www.baidu.com 的过程 1 先要解析出www.baidu.com DNS域名解析为服务器 IP 2 得到 IP地址后,客户端会发起TCP请求,以及3次握手建立连接 3 建立连接 ...

  5. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  6. Scala 基础(二):sbt介绍与构建Scala项目

    一.sbt简介 sbt是类似ANT.MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具. 主要特性: 原生支持编译Scala代码和与诸多Scala测试框架 ...

  7. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  8. 循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

    在前面随笔介绍了ABP+Vue前后端的整合处理,包括介绍了ABP的后端设计,以及前端对ABP接口API的ES6的封装,通过JS的继承类处理,极大减少了重复臃肿的代码,可以简化对后端API接口的封装,而 ...

  9. 微信小程序 + wepy快速开发

    wepy官网:https://tencent.github.io/wepy/document.html,想要了解全面最好去官网,以下只是指出项目里常用地方. 1.页面跳转 (1)//有返回跳转wepy ...

  10. Kafka 是如何管理消费位点的?

    Kafka 是一个高度可扩展的分布式消息系统,在实时事件流和流式处理为中心的架构越来越风靡的今天,它扮演了这个架构中核心存储的角色.从某种角度说,Kafka 可以看成实时版的 Hadoop 系统.Ha ...