很有意思的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上不行。。

  1. const int MAXN=4210;
  2. int n,mod;
  3. ll f[MAXN],c[2][MAXN];
  4. int main()
  5. {
  6. freopen("1.in","r",stdin);
  7. f[0]=f[1]=1;
  8. get(n);get(mod);
  9. int u=0;
  10. c[u][0]=1;
  11. rep(2,n,i)
  12. {
  13. u=u^1;c[u][0]=1;
  14. rep(1,i-1,j)c[u][j]=(c[u^1][j-1]+c[u^1][j])%mod;
  15. for(int j=1;j<=i;j+=2)f[i]=(f[i]+f[j-1]*c[u][j-1]%mod*f[i-j])%mod;
  16. }
  17. printf("%lld\n",(f[n]<<1)%mod);
  18. return 0;
  19. }

再分享一个思路吧:

这是基于分析性质的来的:一个性质 如果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];

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

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

  1. const int MAXN=4210;
  2. int n,mod;
  3. int ans,f[2][MAXN],u;
  4. int main()
  5. {
  6. freopen("1.in","r",stdin);
  7. n=read();mod=read();
  8. if(n==1||n==2)
  9. {
  10. printf("%d\n",n);
  11. return 0;
  12. }
  13. f[u][2]=1;
  14. for(int i=3;i<=n;++i)
  15. {
  16. u=u^1;
  17. for(int j=2;j<=i;++j)
  18. f[u][j]=(f[u][j-1]+f[u^1][i-j+1])%mod;
  19. }
  20. for(int i=2;i<=n;++i)ans=(ans+f[u][i])%mod;
  21. printf("%d\n",(ans<<1)%mod);
  22. return 0;
  23. }

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. POJ3263 Tallest Cow 差分

    题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a p ...

  2. day80 前端项目

    目录 一.初始化项目 二.安装路由vue-router 1 配置路由 1.1 初始化路由对象 1.2 注册路由信息 1.3 在视图中显示路由对应的内容 2 路由对象提供的操作 2.1 页面跳转 2.2 ...

  3. java 面向对象(二):JVM内存结构

    编译完源程序以后,生成一个或多个字节码文件.我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行.意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析. <JVM规范> ...

  4. java 基本语法(十三) 数组(六)数组的常见异常

    1.数组角标越界异常:ArrayIndexOutOfBoundsException int[] arr = new int[]{1,2,3,4,5}; // for(int i = 0;i <= ...

  5. 008.Nginx静态资源

    一 Nginx静态资源概述 1.1 静态资源类型 Nginx作为静态资源Web服务器部署配置, 传输非常高效, 常常用于静态资源处理,请求以及动静分离.通常非服务器动态运行生成的文件属于静态资源. 类 ...

  6. log4j系统日志(转载)

    地址:http://www.codeceo.com/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在a ...

  7. XML解析---利用XStream解析xml数据及反构造Java对象

    XStream 是一个轻量级的.简单易用的开放源代码 Java库,用于将 Java 对象序列化为 XML 或者再转换回来.而且XStream还能将java对象转成其它格式,比如JSon. 需要用到的包 ...

  8. Ethical Hacking - GAINING ACCESS(9)

    Server Side Attack Nexpose - Analysing Scan Results and Generating Reports OS and Software Inforatio ...

  9. Oracle DataGuard主库丢失归档日志后备库的RMAN增量恢复一例

    第一部分  问题描述和环境状态确认 ----1. 问题场景 Oracle DataGuard主库丢失archivelog,如何不重建备库完成同步? 在Oracle DataGuard主从同步过程中可能 ...

  10. PyQt5绘图

    QPainter 功能:QPainter实现在QWidget上画图功能 说明:绘图必须在paintEvent中完成,且要在bengin和end之间作图 接口: 方法 描述 begin 开始画图 end ...