「题解」:[组合数学][DP]:地精部落
拿到这道题秒懂题意:波动序列。
然鹅不会打。想了一节课,想打纯组合数学,结果找不到规律。
想的是先假设拍出一个序列,然后交换其中的元素求组合,
无奈没啥规律可循,显然不能一口气求出来(我说的是我没办法,网上大佬们有的是办法……)
然后想dp,挨个插入,妄图一维dp走起,结果摔倒在地
然后我就不是人了。
^废话^
称n个数组成的波动数列为n阶波动数列。
我们设f[i][j]表示一个i阶波动数列首个数是j且为山峰的排列种数。
然后推一下状态转移方程。
仔细考虑一下,波动序列似乎有这么几个性质
性质一:一个波动序列的连续子序列仍然是波动序列。
性质二:若使一个波动序列排列中大于等于x的元素全部+1,序列仍然满足波动。
性质三:若一个波动序列的排列中x与x+1不相邻,那么交换二者,序列仍然满足波动。
性质四:一个[1,x]的波动序列一定可以对应到[y-x+1,y]的一个波动序列。
其实都是一些十分显然的性质。我们主要用到了性质一、三和四来搞我们的状态转移方程。
简单证明性质三(因为某大佬问我的时候在这个性质上稍微犹豫了一下~)
1.若x为波谷,由于x与x+1不相邻,则x两侧的波峰最低为x+2和x+3,交换后仍然满足波动序列。
2.若x为波峰,x两侧的波谷小于x,则必定小于x+1。所以交换后仍然满足波动序列。
证毕。
(^自己证哒^,有不当的地方请多多海涵并评论指出~谢谢大家~)
所以根据性质一,我们可以进行状态转移。(没错性质一是最费的……)
根据性质三,f[i][j]+=f[i][j-1]。(把+1和-1倒个个儿还是一样的……我是不是证翻了QAQ)这好说。
但我们只考虑了性质三中x与x+1不相邻的状态。
于是尝试把j掐掉。
我们发现,把波动序列最左边的j掐掉之后剩下了一个i-1阶的波动序列。
但是我们不能直接转移,现在最左边的变成了j-1。一切是那么顺利,可是j-1是波谷啊QAQ!!
波谷!!
那怎么办?没关系我们有性质四!
回顾一下性质四:一个[1,x]的波动序列一定可以对应到[y-x+1,y]的一个波动序列。
这是啥?这是救世主!
于是我们把所有的序列对应到i-j+1上,发现这东西瞬间变波峰。
(这需要证明吗QAQ,我懒啊~)
然后我们得到了另外一个状态转移:
f[i][j]+=f[i-1][(i-1)-(j-1)+1]。(别问我为什么变成i-1和j-1了 /糊脸)
完结撒花~
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
#define rint register int
using namespace std;
ll n,mod,f[][];
signed main()
{
ll now=;
scanf("%lld %lld",&n,&mod);
f[now][]=;
for(rint i=;i<=n;i++)
{
now^=;
for(rint j=;j<=i;j++)
f[now][j]=(f[now][j-]+f[now^][i-j+])%mod;
}
ll ans=;
for(rint i=;i<=n;i++)
ans=(ans+f[now][i])%mod;
ans=(ans*%mod+mod)%mod;
printf("%lld\n",ans);
return ;
}
全靠思维量撑起……
「题解」:[组合数学][DP]:地精部落的更多相关文章
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 「TJOI2015」组合数学 解题报告
「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「动态规划」-数位dp专题
数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...
- 「笔记」数位DP
目录 写在前面 引入 求解 特判优化 代码 例题 「ZJOI2010」数字计数 「AHOI2009」同类分布 套路题们 「SDOI2014」数数 写在最后 写在前面 19 年前听 zlq 讲课的时候学 ...
- 「题解」:[组合数学]:Perm 排列计数
题干: Description称一个1,2,…,N的排列P1,P2…,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,…N的排列中有多少是Magic的,答 ...
- 「题解」:[loj2763][JOI2013]现代豪宅
问题 A: 现代豪宅 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...
- 「总结」插头$dp$
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
随机推荐
- spring-boot-configuration-processor
spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了 引入pom依赖 <de ...
- [kuangbin带你飞]专题一 简单搜索 - L - Oil Deposits
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- Python3入门机器学习经典算法与应用✍✍✍
Python3入门机器学习经典算法与应用 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的 ...
- [CERC2017]Gambling Guide
题目 看起来非常随机游走,但是由于我们可以停在原地,所以变得不是非常一样 设\(f_x\)表示从\(x\)到\(n\)的期望距离 如果我们提前知道了\(f\),那么我们随机到了一张到\(y\)的车票, ...
- js只能输入数字和小数点
1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...
- fping简介及使用方法
fping命令的官网为:http://fping.org/ 历史版本下载地址:http://fping.org/dist/ 第一步:安装. wget http://fping.org/dist/fpi ...
- mysql中重复数据只取条
select * from table_a where id in (select min(id) from table_a group by a) )) SUBSTRING_INDEX(cids,' ...
- 2018-8-10-使用-IncrediBuild-提升-VisualStudio-编译速度
title author date CreateTime categories 使用 IncrediBuild 提升 VisualStudio 编译速度 lindexi 2018-08-10 19:1 ...
- css----less预处理器
###less less是一种动态样式语言,属于css预处理器的范畴,它扩展了 CSS 语言, 增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展 LESS 既可以在 客户端 上运行 ,也 ...
- Java 对系统信号的通知获取
主要介绍Java 如何对系统信号通知进行获取和处理.直接上demo @SuppressWarnings("restriction")public class Test1 imple ...