[SDOI2010][BZOJ 1925]地精部落
Description
Input
Output
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,mod;
int f[][][],ans;
int main(){
n=read(),mod=read();
f[][][]=f[][][]=;
f[][][]=f[][][]=f[][][]=f[][][]=;
register int i,j,k;
for(i=;i<=n;i++)
for(j=;j<=i;j++){
for(k=;k<j;k++) f[i][][j]=(f[i][][j]+f[i-][][k])%mod;
for(k=j;k<i;k++) f[i][][j]=(f[i][][j]+f[i-][][k])%mod;
}
for(i=;i<=n;i++) ans=(ans+f[n][][i]+f[n][][i])%mod;
printf("%d\n",ans);
return ;
}
First : 对于每一个 数字 i 和 i+1 , 如果这两个数不是相邻的,那么交换两个数字的对应的方案数是一样的
Second: 我们由 1~n 的波动数列的任意一种,将每一个 ai 都可以用(n+1) 减去,那么得到的新的序列其实还是合法的,而且相对的山谷和山峰会改变!
比如有 波动序列 32415 和 34251
Third : 波动数列具有对称性......(那不是废话)
DP[i][j]表示 选 1 To i 这些数字,第一个数为山峰,且第一个数为 j;答案就是 ∑ DP[N][j] (j = 1 to N)
DP[i][j]=DP[i][j-1]+DP[i-1][i-j+1]
证明:由性质一可知,当j与j-1不相邻的时候,j作为头所有的方案数与j-1作为头的方案数相同,于是就有DP[I][J]=DP[I][J-1];
对于DP[i][j]+=DP[i-1][i+j-1];就是当j 与 j-1相邻时的情况;
我们可以这么想,我第一个数选择了J 并且定义为山峰,那我第二个数j-1必定为山谷,后面的数属于[1,j-1]和[j+1,i];
此时问题转化成了求 i-1个数,j-1为头,但是j-1 为山谷的方案数,由性质2可知,j-1作山谷和作山峰的方案数相同;
现在的问题就是,此时的区间和我DP方程的区间意义不同;
没关系;因为山峰与山谷是相对位置关系,将[j+1,i]区间的每个数都减一,这样是不改变相对大小关系的,并且此时就符合我们的方程了;
另外,我DP[i-1][j-1]表示的是J-1为山顶时的个数,为了让其表示J-1为山谷的情况,要改成DP[i-1][(i-1+1)-(j-1)];
这样就得到了我们的转移方程,我们可以用滚动数组优化空间;
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int f[][];
int n,mod,ans;
int main(){
n=read(),mod=read();
f[][]=;
for(int i=;i<=n;i++)for(int j=;j<=i;j++)
f[i&][j]=(f[i&][j-]+f[(i-)&][i-j+])%mod;
ans=;
for(int j=;j<=n;j++)ans=(ans+f[n&][j])%mod;
printf("%d",(ans<<)%mod);
return ;
}
来自PaperCloud的博客,未经允许,请勿转载,TKS!
[SDOI2010][BZOJ 1925]地精部落的更多相关文章
- [sdoi 2010][bzoj 1925]地精部落(神仙dp)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- bzoj 1925 地精部落
Written with StackEdit. Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 \(N\) 的山脉 \(H ...
- BZOJ 1925 地精部落(DP)
一道很经典的DP题. 题意:求n排列中波动排列的种数. 不妨考虑DP,令dp1[i][j],表示1-j的排列中,第一项为i之后递增的波动排列种数.dp2[i][j]表示1-j的排列中,第一项为i之后递 ...
- BZOJ 1925地精部落题解
题目链接 一道神仙题,有很多思考的方式,这里选择最好理解的一种来讲 我们将序列分为两种,一种开头递增,一种开头递减,显然这两种序列的数目是一样的 现在我们只用考虑开头递增的情况 f[i][j]表示前i ...
- BZOJ 1925: [Sdoi2010]地精部落( dp )
dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...
- 1925: [Sdoi2010]地精部落
1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1929 Solved: 1227 [Submit][Statu ...
- 【BZOJ1925】[SDOI2010]地精部落(动态规划)
[BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...
- 【bzoj1925】地精部落[SDOI2010](dp)
题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...
- BZOJ_1925_[Sdoi2010]地精部落_递推
BZOJ_1925_[Sdoi2010]地精部落_递推 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 ...
随机推荐
- ① Python3.0基础语法
稍微了解一下py2.0和py3.0的区别,Py3.0在设计的时候,为了不带入过多的累赘,没有考虑向下兼容低版本的Py2.0.而在低版本中Py2.6作为过渡版,基本使用Py2.x的语法和库,同时考虑Py ...
- NEST search查询
/// <summary> /// GET /megacorp/employee/_search /// </summary> /// <returns></ ...
- 忽略警告@SuppressWarnings的用法
@SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 我们可以在方法上加上@S ...
- iOS 10.0前的Notification推送
前言 推送为远程推送,一般由苹果APNS服务器发送给苹果设备(iPhone,iPad) 推送分在前台和后台.在前台时 用户可以在application 的代理回调接口中做相应处理:在后台时 系统会全权 ...
- SAP Marketing Cloud功能简述(四) : 线索和客户管理
这个系列的前三篇文章Grace Dong已经给大家带来了下面的内容: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Clou ...
- Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器
DOM解析XML在j2ee开发中比较常见,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这 ...
- IDEA 使用教程(破解2019.1.1)
2019-08-02更新 最新破解方法: ZKVVPH4MIO-eyJsaWNlbnNlSWQiOiJaS1ZWUEg0TUlPIiwibGljZW5zZWVOYW1lIjoi5o6I5p2D5Luj ...
- Immediate Decodability UVA-644(qsort排序 + 模拟)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...
- python __main__ 里的变量是全局变量 因此在函数里面可以访问到
__main__ and scoping in python from:https://stackoverflow.com/questions/4775579/main-and-scoping-in- ...
- No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...