[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可分 ...
随机推荐
- 【阿里云开发】- 安装JDK
1.阿里云轻量服务器入口 https://swas.console.aliyun.com/?spm=5176.2020520001.1011.2.29ff4bd3P4AEDc#/servers 2.使 ...
- pytest用例传参的多种方式
1.接收外部传参 *函数获取需要的参数,再传入 *函数获登录信息,直接使用 2.其它方式传参 *依据dict取值 *tuple数组
- Switch开关在element-ui表格中点击没有效果解决方法
<el-table-column label="三审" align="center"> <template slot-scope=" ...
- Windows10 安装VirtualBox出现2502、2503错误解决方法
先来到VirtualBox的下载位置,如图,笔者位置在D:/vb文件夹下 下载目录 然后按住win+R(win就是左下角ctrl和alt之间那个键),输入cmd,然后回车 如果在C盘的话,就直接c ...
- FreeRTOS队列操作
API函数 //创建 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemS ...
- LinuxKernel优秀博客
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档 [力荐] 5. ...
- mac安装openjdk8-maven-mysql-git-docker
1. openjdk8安装命令查看地址:https://github.com/AdoptOpenJDK/homebrew-openjdk#other-versions 感觉上面命令地址不靠谱,还是 ...
- ansible之基础篇(一)
ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...
- FastJSON JSONObject 字段排序 Feature.OrderedField
package cn.tongdun.robot.web; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeRefe ...
- 开发指南~小程序代码构成~JSON配置
2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ...