地精部落 bzoj-1925 Sdoi-2010

题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数)

注释:$1\le n\le 4200$ , $1\le p\le 10^9$。

想法:神题!这题标签给的是dp,但是一个没有动态性的dp应该叫递推吧qwq。先证几个引理:

引理1:对于任意的一个波动序列,将其中的第i个数a[i]离散成坐标系中的一个点(i,a[i]),这样所构成的波动离散点集关于任意的一条平行于x轴的直线对称后的(i,a'[i]),a'序列仍是波动序列。

  证明:假设那条直线是y=b。那么对于任意的$i\in [2,n-1]$,都有min(b-a[i-1],b-a[i+1])>b-a[i]或max(b-a[i-1],b-a[i+1])<b-a[i],反转之后,显然有max(a[i-1],a[i+1])<a[i]or min(a[i-1],a[i+1])>a[i],证毕。

引理2:如果交换波动序列中两个位置不相邻但是单调性相邻的数(单调性相邻,就是说将原波动序列上的所有数按照权值排序后相邻的两个数),交换后的序列仍是波动序列,

  证明:显然。

然后,我们设

  递推状态:dp[i][j],表示1~i的排列中,第一位为j且为山峰的方案数。

  转移:dp[i][j]=dp[i][j-1]+dp[i-1][i-j+1]。

为什么呢?首先,我们对dp[i][j]的所有方案进行一个分划:由于j是第一位且为山峰,所以,j-1可以处在第二位。但是dp[i][j-1]中,j是不可能处在第二位的,所以,我们对于dp[i][j-1]中的每一种排列都将j和j-1交换。j-1是山峰交换后j自然也是山峰,由引理2可知交换后仍是波动序列。此时,我们处理好了j-1不在第二位的情况。如果j-1钦定在第二位呢?我们对于这样的i-1个数:1,2,...j-1,j+1,...,i。将它们所有的数都变成关于y=0对称后向上平移i个单位的数,即变成:i-1,i-2,...,i-j+1,i-j-1,...,0.然后,我们有:dp[i][i-j+1]是原序列从小到大排序,第i-j+1个数作为第一个数且为山峰的方案数。这样的方案数在将所有数都恢复到原来的样子,仍然是波动序列只不过第一个数是j-1且为山谷,将j放在j-1之前,恰满足题意。

最后,附上丑陋的代码... ...

#include<bits/stdc++.h>
#define N 5010
using namespace std;
int dp[2][N];
int n,mod;
int main()
{
scanf("%d%d",&n,&mod);
dp[0][2]=1;
for(int i=3;i<=n;i++)
{
for(int j=2;j<=i;j++)
{
dp[i&1][j]=(dp[i&1][j-1]+dp[(i-1)&1][i-j+1])%mod;
}
}
int ans=0;
for(int j=2;j<=n;j++)
{
ans=(ans+dp[n&1][j])%mod;
}
printf("%d",(ans<<1)%mod);
}

小结:对于波动序列,有一些小的引理或性质有待挖掘... ...

[bzoj1925][Sdoi2010]地精部落_递推_动态规划的更多相关文章

  1. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

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

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

  3. 2018.10.20 bzoj1925: [Sdoi2010]地精部落(dp)

    传送门 dp好题. 设f[i][j]f[i][j]f[i][j]表示iii个数结尾是jjj且结尾两个数递增的方案数. 那么显然可以对称的定义出g[i][j]g[i][j]g[i][j]表示iii个数结 ...

  4. BZOJ1925[SDOI2010]地精部落

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

  5. [BZOJ1925][SDOI2010]地精部落(DP)

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

  6. BZOJ1925 [Sdoi2010]地精部落 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1925 题意概括 给出n,n<=4200,问1~n这些数的排列中,有多少满足一下性质: 性质: ...

  7. BZOJ1925 [Sdoi2010]地精部落 【dp】

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

  8. [bzoj1925][Sdoi2010][地精部落] (序列动态规划)

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

  9. SDOI 2010 and SXOI 2014 地精部落 (递推)

    用E[i,j]表示共有i个数字,以1..j开头且一开始下降的方案数的总和.则我们有: E[i,j]:=E[I,J-1]+E[i-1,i-j] 我们先来证明上升与下降的方案是一一对应的. 事实上,若有a ...

随机推荐

  1. Going Home(MCMF)

    http://poj.org/problem?id=2195 题意:在一个n*m的图中,'m'代表人,'H'代表房子,人每移动一次的费用为1,求所有人移动到房子里的最小花费. 思路:最小费用最大流问题 ...

  2. codevs3162抄书问题(划分型dp)

    3162 抄书问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每 ...

  3. Oracle group by分组拼接字符串

    select wm_concat(id),depon  from test_1  group by depon

  4. 02-vue过滤器和键盘修饰符

    过滤器 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的 ...

  5. ACM_统计字符串

    统计字符串 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定n个字符串,统计字符串的个数. 如给定 5 sss ab sss ...

  6. C# 多线程系列(五)

    死锁 为了线程安全,我们在需要的是会使用”独占锁“,但过多的锁定也会有麻烦.多个线程因为竞争资源相互等待而造成的僵局,我们称为死锁.若无外力作用,这些进程将都无法推进.在死锁中,至少有两个线程被挂起, ...

  7. Android FileProvider相关 Failed to find configured root that contains

    问题: 使用FileProvider构造SD卡中文件uri时异常 java.lang.IllegalArgumentException: Failed to find configured root ...

  8. Quartz实战

    https://my.oschina.net/yinxiaoling/blog/542336?fromerr=s3ko7u33 Quartz实战 > 一.内存型(1) <bean name ...

  9. typeof和instanceof的区别

    typeof和instanceof的区别: typeof typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型.typeof 一般只能 ...

  10. java关于工作,跳槽之总结

    关于工作中: 如何展示自己项目中的亮点,技术或者难点: 总结我的经历和技术倒是可以,但是我做的项目和我会的技术都很平庸,实在找不到亮点怎么办? 如果知道了你没有亮点,也就是知道了你自己欠缺什么,那么下 ...