[sdoi 2010][bzoj 1925]地精部落(神仙dp)
Description
Input
Output
Sample Input
Sample Output
数据范围与提示
对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤10^9
神仙题,太神仙了
最近在做组合数学,然后一看到这道题就想去打表找规律。手模了几组小样例后发现真的是毫无规律可言,于是开始找各种性质深陷其中,未果,寻病终。
然鹅,手模万岁
最后开始找i个数和i+1个数之间的关系,不断地往上一个序列里插数,过了一会转念一想,嗯?嗯?嗯?这不dp吗
然后就往dp上面想,这题总的来说还是思考了挺长时间。
一开始我想的是f[i][j]表示[1~i]的数且首项为j的方案总数(没想到这个状态数组定义的还挺接近于正解)。
然后又开始各种找规律,又手模了半天自己也发现了一些性质,但对于状态转移没有什么用,实在是想不出来了,就颓了题解。
题解真是神仙(蒟蒻博主看什么都神仙)。
我们姑且称满足题意的序列为抖动序列
首先我们来证明一波性质:
- 对于一个抖动序列,若j与j+1不相邻,则交换j与j+1后的序列仍为抖动序列。证明:若j与j+1不相邻那么与j或j+1相邻的数与j或j+1的差值至少为2,那么显然交换之后此序列仍为抖动序列。
- 如果将一个抖动序列中所有大于等于x的元素都加1,那么此序列仍为抖动序列。证明:我们先考虑每一个波谷和其两侧的波峰,我们可以分情况讨论若此部分三个数均大于或小于x,显然成立,如果此部分波谷小于x,而波峰大于x,加一,显然成立,因为每个小部分都成立,所以总体成立。(蒟蒻博主自己瞎搞的,可能是伪证,大神觉得有问题请指正)
- 把一个抖动序列的每一项i都变成n-i+1,那么此序列仍为抖动序列。证明(这绝逼是伪证,博主蒟蒻,各位神犇凑或者看吧):(感受一下)其实这个定理大家想想就能想明白,就相当于如果一个数很大,那么减掉它之后就会变成一个小数,反之亦然,并且大小关系倒置。
然后就可以dp了,我们设f[i][j]为已经有i个数,且首项为j且j为波峰的方案总数。
既然确定了首项,我们在来考虑第二项,若第二项不为j-1,那么根据引理1,我们把所有这种情况下的序列都交换j与j-1的位置,交换之后的序列仍为抖动序列,那么这种情况方案数为f[i][j-1]。
我们在来考虑第二项为j-1的情况,这种情况就比较麻烦,我们去掉第一个数j后,所剩下的就只有[1~j-1]和[j+1~i],考虑把第二个区间减一那么就得到了一个[1~i-1]的抖动序列,再使j-1为波谷,
根据引理3,此种情况方案总数为f[i-1][i-1-(j-1)+1]=f[i-1][i-j+1]。
因为对称性我们把ans×2,就的到了结果。
下面是代码,用了滚动数组省空间
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define int long long
const int M=;
using namespace std;
int f[][M];
signed main(){
int n,p;
scanf("%lld%lld",&n,&p);
int now=,pre=;
f[now][]=;
for(int i=;i<=n;i++){
swap(now,pre);
for(int j=;j<=i;j++){
f[now][j]=(f[now][j-]+f[pre][i-j+])%p;
}
}
int ans=;
for(int i=;i<=n;i++){
ans=(ans+f[now][i])%p;
}
ans*=;
printf("%lld",(ans%p+p)%p);
}
地精部落
9
[sdoi 2010][bzoj 1925]地精部落(神仙dp)的更多相关文章
- BZOJ 1925 地精部落(DP)
一道很经典的DP题. 题意:求n排列中波动排列的种数. 不妨考虑DP,令dp1[i][j],表示1-j的排列中,第一项为i之后递增的波动排列种数.dp2[i][j]表示1-j的排列中,第一项为i之后递 ...
- [SDOI2010][BZOJ 1925]地精部落
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- bzoj 1925 地精部落
Written with StackEdit. Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 \(N\) 的山脉 \(H ...
- BZOJ 1925地精部落题解
题目链接 一道神仙题,有很多思考的方式,这里选择最好理解的一种来讲 我们将序列分为两种,一种开头递增,一种开头递减,显然这两种序列的数目是一样的 现在我们只用考虑开头递增的情况 f[i][j]表示前i ...
- BZOJ-1925 地精部落 烧脑DP+滚动数组
1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1053 Solved: 633 [Submit][Status ...
- 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP
[BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...
- bzoj1925 [Sdoi2010] 地精部落【DP】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...
- bzoj 1925 [Sdoi2010]地精部落(DP)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- bzoj 1925: [Sdoi2010]地精部落【dp】
设[f[i][j]为1到i,开头数字是j并且是山峰的方案数 注意到当数字j和j-1不相邻时,交换它们会得到一个新的符合要求的序列,所以f[i][j]+=f[i][j-1]; 如果相邻,那么j是山峰,j ...
随机推荐
- 9.bash历史的交互使用
9.历史的交互使用本章从用户的角度介绍了如何使用 GNU 的历史库功能.可以把这里的内容作为用户指南.关于如何在其它程序中使用 GNU 的历史库功能,请参考<GNU Readline 库参考手册 ...
- JDBC24homework
编写程序: 创建一个类DBTools,在DBTools中创建一个方法find,find方法用于对数据库进行查询操作,现在要求将结果集封装成数组线性表嵌套数组的形式: ArrayList<Stri ...
- java中的接口和php的接口的区别
php: 规范: 接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 在接口中的抽象方法只能是public的,默认也是public权限. abstract和final修饰符也不能修饰接口中 ...
- LeetCode 172:阶乘后的零
给定一个整数 n, 返回 n! 结果中尾数为零的数量. 示例 : 输入: 输出: 解释: ! = , 尾数中没有零. 示例 : 输入: 输出: 解释: ! = , 尾数中有个零. 说明:算法的时间复杂 ...
- java基础4(线程)
1.请简单描述什么是并行,什么是并发? 并行:指两个或多个事件在同一时刻发生(同时发生). 并发:指两个或多个事件在同一个时间段内发生. 通俗易懂版: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去 ...
- 第十三章、元类(metaclass)
目录 第十三章.元类(metaclass) 一.什么是元类 二.为什么用元类 第十三章.元类(metaclass) 一.什么是元类 在python中一切皆对象,那么我们用class关键字定义的类本身也 ...
- 第五篇python进阶之深浅拷贝
目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...
- fastadmin 页面添加编辑日期时间
添加 <div class="form-group"> <label class="control-label col-xs-12 col-sm-2&q ...
- 辨析 const指针 和 指向常量的指针
辨析以下几种指针p的定义. ; int *p = &tmp; const int *p = &tmp; int const* p = &tmp; int * const p = ...
- centos 7 Apache-Tomcat-8.5.46 安装 Web 应用服务器
tomcat 官网版本地址:https://tomcat.apache.org/whichversion.html Servlet规格 JSP规范 EL规格 WebSocket规范 JASPIC规格 ...