地精部落 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. 【转】Java - printf

    [转自]http://heidian.iteye.com/blog/404632 目前printf支持以下格式:            %c        单个字符            %d     ...

  2. [Swift通天遁地]三、手势与图表-(3)通过捏合手势放大和缩小图像视图

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. async 函数-----------------解决异步操作隧道的亮光

    之前也学过,只是没有学好,公司现在用的都是async函数 , 所以决定把它弄懂.最近看了看阮一峰的博客,做下记录. 异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用 ...

  4. Codeforces 718C 线段树+矩乘

    题意: 维护一个序列,支持两种操作:1.区间[l,r]的权值+x2.询问区间[l,r]的函数和,即∑fib(x)这里的函数即斐波那契函数数据范围:1≤n,q≤105 思路:一般求斐波那契函数的方法可以 ...

  5. 题解报告:hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每 ...

  6. Kibana里No Marvel Data Found问题解决(图文详解)

    问题详情 http://192.168.80.145:5601/app/marvel#/no-data?_g=(refreshInterval:(display:'10%20seconds',paus ...

  7. 10 在C#中读取文件

    我们在前一个练习中已经了解了如何在C#控制台程序(console)中读取用户的输入.现在我们要学习如何从一个文件中读取内容.在下面的练习中,你要格外小心.关于文件的操作,一不小心会损失你的重要文件. ...

  8. Tomcat发布项目,域名访问

    域名访问项目 1,去掉访问路径的端口号: 找到 Tomcat 下的 conf 文件中的 server.xml,找到 8080 修改成 80, 2,项目绑定域名: <Host name=" ...

  9. 阿里云虚拟主机针对恶意频繁攻击式访问造成CPU爆满的解决方法

    最近网站CPU经常爆满,到阿里云提交了工单,工程师给我的处理意见:   您好,虚拟主机CPU占用比较高通常这种情况有两种可能:   一是网站应用程序代码逻辑较复杂,或业务架构效率比较低,在请求了某个网 ...

  10. SAS学习笔记之《SAS编程与数据挖掘商业案例》(1)系统简介和编程基础

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(1)系统简介和编程基础 1. SAS系统简介 1.1 SAS是先编译后执行的语言,data步标志着编译的开始. 数据指针:当前内存缓存区, ...