[bzoj1925][Sdoi2010]地精部落_递推_动态规划
地精部落 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]地精部落_递推_动态规划的更多相关文章
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- bzoj1925 [Sdoi2010] 地精部落【DP】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...
- 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个数结 ...
- BZOJ1925[SDOI2010]地精部落
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- [BZOJ1925][SDOI2010]地精部落(DP)
题意 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...
- BZOJ1925 [Sdoi2010]地精部落 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1925 题意概括 给出n,n<=4200,问1~n这些数的排列中,有多少满足一下性质: 性质: ...
- BZOJ1925 [Sdoi2010]地精部落 【dp】
题目 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...
- [bzoj1925][Sdoi2010][地精部落] (序列动态规划)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- SDOI 2010 and SXOI 2014 地精部落 (递推)
用E[i,j]表示共有i个数字,以1..j开头且一开始下降的方案数的总和.则我们有: E[i,j]:=E[I,J-1]+E[i-1,i-j] 我们先来证明上升与下降的方案是一一对应的. 事实上,若有a ...
随机推荐
- IOException 简单解决方法
java.lang.IllegalStateException异常解决方法 这个异常大多数是由文件读取,下载时抛出,但是偶尔也会由类型转换时异常抛出此异常. 错误:Optional int param ...
- [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- SpringBoot集成Swagger2 以及汉化 快速教程
(一) Swagger介绍 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件 (二)为什么使用Swagger 在现在的开发过程中还有很大一部分公司都是以口口相传的方式来进行 ...
- python自动化测试学习笔记-2-列表
上次我们学习了python的基本概念,了解了python的变量及数据类型,并实战了条件判断,for/while循环,字符串输出,格式化输出的一些基本用法,接下来我们继续学习其他的一些数据类型. pyt ...
- hdu2029
http://acm.hdu.edu.cn/showproblem.php?pid=2029 #include<stdio.h> #include<string.h> #inc ...
- hdu2027
http://acm.hdu.edu.cn/showproblem.php?pid=2027 #include<iostream> #include<stdio.h> #inc ...
- Mysql(Innodb)如何避免幻读
Mysql(Innodb)如何避免幻读 有意思 MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key. 间隙锁(Gap Lock):锁定 ...
- java heap 异常
近期,项目每运行一周之后就会堆异常, java.lang.OutOfMemoryError: Java heap space,导致应用中断. 解决办法:将堆内存修改大一点. 从性能优化工具中可以看到修 ...
- build.gradle(Mdule.app)依赖库相关
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //noinspection GradleCompati ...
- Android中ViewPager动态创建的ImageView铺满屏幕
ImageView imageView=new ImageView(context); imageView.setScaleType(ScaleType.FIT_XY);//铺满屏幕