强!强!强!强!劲啊劲啊劲啊!!!洛谷P2467

非常重要的,就在于发现以下的两条性质:

1.当i与i+1不相邻时,方案数是一样的:交换这两个数,<i+1的必然<i,>i+1的必然>i,又因为i+1与i不相邻,所以>i的>i+1,<i+1的也<i。

2.将每个数变成(n+1-i)时,仍然是满足性质的波动序列,且山峰与山谷反置。这个怎么理解呢?可以当做补全柱状图,画一画就是一个显而易见的结论。

那么我们定义状态dp[i][j]为将前i个数排列组合,且j为第一个山峰的合法方案数。

由第一条性质可得:当j与j-1不相邻的时候,dp[i][j]=dp[i][j-1];

那么当j与j-1相邻的时候呢?可以注意到,j>j-1,j为山峰,j-1为山谷。我们所求的实际上就是包含了1-j-1,j+1-i这些数且开头为j-1的山谷的方案数。

这个东西要怎样通过之前的状态表示出来呢?可以发现有两个障碍:1.区间不连续 2.开头为山谷。

针对1,我们发现方案数与数字的大小并无关系,只与数字的相对大小有关。而j+1-i中的所有数都>1-j-1的数,将前一部分中的每个数减去1,就可以得到1-i-1的连续区间,且因为没有改变相对位置的关系,所以方案数是相同的。

针对2,我们运用第2条性质,将山峰与山谷反置。

综上所述,我们所求的即是dp[i-1][(i-1)+1-(j-1)] --> dp[i-1][i-j+1];

所以得到完整的dp方程:dp[i][j]=dp[i][j-1]+dp[i-1][i-j+1];为了节约空间,我们可以使用滚动数组来计算。

答案为sigma(dp[n][i])(i=2~n)*2.为什么要乘以二?以x为山峰的所有方案反置即得到以(n+1-x)为山谷的方案数,所以要计算两次。

非常棒的一道题目呀

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 4300
#define ll long long
ll n, p, dp[][maxn], ans;
int main()
{
scanf("%lld%lld", &n, &p);
int pre = , now = ;
dp[][] = ;
for(int i = ; i <= n; pre ^= , now ^= , i ++)
for(int j = ; j <= i; j ++)
dp[now][j] = (dp[now][j - ] + dp[pre][i - j + ]) % p;
now ^= ;
for(int i = ; i <= n; i ++) ans = (ans + dp[now][i]) % p;
printf("%lld", (ans << ) % p);
return ;
}

【题解】SDOI2010地精部落的更多相关文章

  1. 【BZOJ1925】[SDOI2010]地精部落(动态规划)

    [BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...

  2. 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP

    [BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...

  3. BZOJ 1925: [Sdoi2010]地精部落( dp )

    dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...

  4. BZOJ_1925_[Sdoi2010]地精部落_递推

    BZOJ_1925_[Sdoi2010]地精部落_递推 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 ...

  5. 1925: [Sdoi2010]地精部落

    1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1929 Solved: 1227 [Submit][Statu ...

  6. [BZ1925] [SDOI2010]地精部落

    [BZ1925] [SDOI2010]地精部落 传送门 一道很有意思的DP题. 我们发现因为很难考虑每个排列中的数是否使用过,所以我们想到只维护相对关系. 当我们考虑新的一个位置时,给新的位置的数分配 ...

  7. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  8. bzoj1925 [Sdoi2010] 地精部落【DP】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...

  9. [bzoj1925][Sdoi2010]地精部落_递推_动态规划

    地精部落 bzoj-1925 Sdoi-2010 题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数) 注释:$1\le ...

  10. [SDOI2010]地精部落 题解

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

随机推荐

  1. 初次了解MVC框架模式

    MVC框架:即Model.View.Controller即模型.视图.控制器. View层是界面,Model层是业务逻辑,Controller层用来调度View层和Model层,将显示界面和业务逻辑合 ...

  2. 量化交易之 tushare

    作为一名老股民,我对金融市场一直都保持长期的关注. 最近我大量接触量化交易相关的一切,发现市场力量还是蛮强大的,6年前的很多设想现在已经彻底变成现实,不得不承认市场从来不会等任何人.想好就要马上行动, ...

  3. ctf题目writeup(4)

    2019.1.31 题目:这次都是web的了...(自己只略接触隐写杂项web这些简单的东西...) 题目地址:https://www.ichunqiu.com/battalion 1. 打开链接: ...

  4. 实验吧编程题python

    网址:http://ctf5.shiyanbar.com/jia 之后第一步就是刷新一下网页,发现给的公式会变,(废话,要不直接算数不就行了...)但是格式不会变. 所以那就暴力一点好了,我们看一下这 ...

  5. Go生成UUID

    Go生成UUID 在实际项目中,是经常会使用到一个唯一标识的,比如唯一标识一条记录等,使用C#得到唯一标识是很容易的.例 string guid = Guid.NewGuid().ToString() ...

  6. (数据科学学习手札19)R中基本统计分析技巧总结

    在获取数据,并且完成数据的清洗之后,首要的事就是对整个数据集进行探索性的研究,这个过程中会利用到各种描述性统计量和推断性统计量来初探变量间和变量内部的基本关系,本篇笔者便基于R,对一些常用的数据探索方 ...

  7. 笔记-flask-原理及请求处理流程

    笔记-flask-原理及请求处理流程 1.      服务器声明及运行 最基本的flask项目代码如下 from flask import Flask app = Flask(__name__) @a ...

  8. WPF中的线程使用

    原文:WPF中的线程使用 简介 但凡涉及到图形界面,往往的设计都是不支持或者不推荐使用多个线程操作界面内容.而且通常会有一个专门的线程调度器来处理任务线程和界面线程的问题.下面提供两个两个方案. 使用 ...

  9. 【转】让Moodle支持多个域名

    默认情况下,moodle仅能绑定一个域名.但是由于学校网络分内网和外网,总希望如果是外网访问的,用外网的域名,用内网访问的,就转到内网的ip.这样访问的速度会更快一些,也减低对防火墙的压力.尤其是当外 ...

  10. 初步学习pg_control文件之十五

    接前文  初步学习pg_control文件之十四 再看如下这个: int MaxConnections; 应该说,它是一个参考值,在global.c中有如下定义 /* * Primary determ ...