[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 ...
随机推荐
- 从入门到自闭之Python集合,深浅拷贝(大坑)
小数据池 int: -5~256 str: 字母,数字长度任意符合驻留机制 字符串进行乘法时总长度不能超过20 特殊符号进行乘法时只能乘以0 代码块: 一个py文件,一个函数,一个模块,终端中的每一行 ...
- 在react项目当中做导航守卫
距离上一篇文章,似乎已经过去好久了. 确实是最近相对忙了一点,本身是用vue重构之前一个传统的项目,就自己一个人写.而且,在稍微闲暇之余,想着同时用react也重构一遍,也算是对react的学习吧!毕 ...
- 怎样重置MySQL密码?
systemctl stop mysqld systemctl set-environment MYSQLD_OPTS="--skip-grant-tables" systemct ...
- java——HashSet类中的常见方法
package com.xt.set; import java.util.HashSet; import java.util.Iterator; import java.util.Set; publi ...
- 【原创】大叔经验分享(59)kudu查看table size
kudu并没有命令可以直接查看每个table占用的空间,可以从cloudera manager上间接查看 CM is scrapping and aggregating the /metrics pa ...
- CentOS6.8安装Python3.6.3
1.linux下安装python3 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum install zlib-devel bzip2-devel ...
- VC++ warning C4819 的解决方法(转)
编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...
- java基础4(线程)
1.请简单描述什么是并行,什么是并发? 并行:指两个或多个事件在同一时刻发生(同时发生). 并发:指两个或多个事件在同一个时间段内发生. 通俗易懂版: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去 ...
- php操作 cookie
1,设置cookie <?php setcookie('key'); setcookie('key1','value1'); setcookie(***); setcookie('key4', ...
- Cannot create OpenGL context for 'eglMakeCurrent'.
10.3.2编译的app,在小米手机上出这个问题,华为的正常. 解决方法: 窗口的Quality属性用SystemDefault,不要用HighQuality. 10.3.1也有此问题.