【BZOJ1925】[SDOI2010]地精部落(动态规划)

题面

BZOJ

洛谷

题解

一道性质\(dp\)题。(所以当然是照搬学长PPT了啊

先来罗列性质,我们称题目所求的序列为抖动序列:

  • 一个抖动序列的连续子序列还是一个抖动序列。
  • 如果在一个抖动序列中\(x\)与\(x+1\)不相邻,那么交换两者的位置这个序列仍是抖动序列。
  • 如果将一个抖动序列中所有大于\(x\)的元素全部\(+1\),那么这个序列仍然是抖动序列。
  • 一个\([1,x]\)的抖动序列可以映射到一个\([y-x+1,y]\)的抖动序列。

上面的性质都比较显然。证明什么的感性理解一下就好了。

现在来写\(dp\)。

设\(f[i][j]\)表示\([1,i]\)构成的排列中,第一个数为\(j\)的抖动序列的个数,并且强制第一个数大于第二个数,即第一个位置上是一个峰。

第一个数这已经确定,现在考虑第二个位置上的数。

如果这个数不是\(j-1\),那么我们必定可以交换\(j\)以及\(j-1\),不难发现这样子是一一对应的,也就是\(f[i][j]\leftarrow f[i][j-1]\)

否则这个数是\(j-1\)。那么我们先把第一个\(j\)个忽视掉,剩下的部分的值是\([1,j-1]\cup[j+1,i]\),那么我们这样子想,我们只需要剩下的这些值离散,变成了\([1,i-1]\),然后构成了一个以\(j-1\)开头的抖动序列,再把\([j+1,i-1]\)这一段全部加一,最后再把\(j\)放回到开头,这样子就可以得到一个抖动序列了。但是我们似乎没法直接从\(f[i-1][j-1]\)转移过来,因为在上述状态中\(j-1\)是一个峰,但是在\(f[i][j]\)的状态中,\(j-1\)是一个谷。然而并没有什么关系,我们用上面的最后一个结论,把所有的数全部映射一下,即\(j-1\)映射到\(i-j+1\)。那么就可以得到\(f[i][j]\leftarrow f[i-1][i-j+1]\)

那么这样子就可以\(dp\)了,转移方程是\(f[i][j]=f[i][j-1]+f[i-1][i-j+1]\)

那么答案就是\(\sum f[n][i]\)啦,但是别忘了这样子强制了第一个位置是峰,再映射一下,发现还要乘个二就可以把谷的贡献给算进来啦。

#include<iostream>
#include<cstdio>
using namespace std;
int n,MOD,f[2][4250],ans;
int main()
{
scanf("%d%d",&n,&MOD);f[0][1]=1;
for(int i=1,nw=1,pw=0;i<=n;++i,nw^=1,pw^=1)
for(int j=1;j<=i;++j)
f[nw][j]=(f[nw][j-1]+f[pw][i-j+1])%MOD;
for(int i=1;i<=n;++i)ans=(ans+f[n&1][i])%MOD;
ans=(ans+ans)%MOD;printf("%d\n",ans);
return 0;
}

【BZOJ1925】[SDOI2010]地精部落(动态规划)的更多相关文章

  1. BZOJ1925 [Sdoi2010]地精部落 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1925 题意概括 给出n,n<=4200,问1~n这些数的排列中,有多少满足一下性质: 性质: ...

  2. [bzoj1925][Sdoi2010]地精部落_递推_动态规划

    地精部落 bzoj-1925 Sdoi-2010 题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数) 注释:$1\le ...

  3. bzoj1925 [Sdoi2010] 地精部落【DP】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...

  4. [bzoj1925][Sdoi2010][地精部落] (序列动态规划)

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  5. BZOJ1925[SDOI2010]地精部落

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  6. [BZOJ1925][SDOI2010]地精部落(DP)

    题意 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...

  7. BZOJ1925 [Sdoi2010]地精部落 【dp】

    题目 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...

  8. 【czy系列赛】czy的后宫4 && bzoj1925 [Sdoi2010]地精部落

    [问题描述] czy有很多妹子,妹子虽然数量很多,但是质量不容乐观,她们的美丽值全部为负数(喜闻乐见). czy每天都要带N个妹子到机房,她们都有一个独一无二的美丽值,美丽值为-1到-N之间的整数.他 ...

  9. 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个数结 ...

  10. 题解 [BZOJ1925][SDOI2010] 地精部落

    题面 解析 这个似乎并不好讲啊 设\(f[i][j]\)表示有\(i\)座山, 最后一座山到达高度是\(i\)座中第\(j\)大的, 且最后一座山是山谷. 注意,\(i\)是代表有\(i\)座山,并不 ...

随机推荐

  1. C#深入理解AutoResetEvent和ManualResetEvent

    当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考 ...

  2. HNOI2019 多边形 polygon

    HNOI2019 多边形 polygon https://www.luogu.org/problemnew/show/P5288 这题镪啊... 首先堆结论: 显然终止状态一定是所有边都连向n了 根据 ...

  3. Docker 小记 — Docker Engine

    前言 用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅"官方文档".本篇为 Docker En ...

  4. VS2010、VS2012、VS2013、VS2015、VS2017各版本产品激活秘钥

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...

  5. zookeeper Error contacting service 解决

    连接kafka集群,有一个kafka机器连接失败 到该kafka机器上查询kafka进程,发现没有, 再查看zookeeper状态,提示 Error contacting service. It is ...

  6. centos下升级git版本的操作记录

    在使用git pull.git push.git clone的时候,或者在使用jenkins发版的时候,可能会报类似如下的错误: error: The requested URL returned e ...

  7. PairProject-电梯调度程序结对编程

    结对编程人员:184/050 1 结对编程 1.1 结对编程的优缺点 优点: ● 与单独开发相比,结对能够使人们在压力之下保持更好的状态.结对编程鼓励双方保持代码的高质量,即使在出现了让人不得不飞快地 ...

  8. 读书笔记(chapter4)

    进程调度 4.1多任务 1.多任务系统可以划分为:非抢占式多任务和抢占式多任务: (在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个动作叫抢占: 时间片实际上 ...

  9. pl/sql破解方法

    转载源:http://blog.csdn.net/oscar999/article/details/2123803 打开注册表在run下输入regedit删除1.HKEY_CURRENT_USER/S ...

  10. action中session的存取

    存 ActionContext.getContext().getSession().put("teacherlist", teacherlist); 取 teacherlist=( ...