「题解」:[组合数学][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$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
随机推荐
- jquery preventDefault()事件
定义和用法 preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交). 语法 event.preventDefault() 参数 描述 event 必需. ...
- PAT_A1086#Tree Traversals Again
Source: PAT A1086 Tree Traversals Again (25 分) Description: An inorder binary tree traversal can be ...
- 20140502 static_cast和dynamic_cast的类型检查 双链表建立,删除,打印
1.static_cast和dynamic_cast的类型检查 static_cast的类型检查:只检查无关类之间的转换 CBaseY* pY1 = static_cast<CBaseY*> ...
- 3.1_springboot2.x检索之elasticsearch安装&快速入门
1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...
- USACO2008 Cow Cars /// oj23323
题目大意: N (1 ≤ N ≤ 50,000)头牛被编号为1-N,牛i可以在M(1 ≤ M ≤ N)条不同的高速路上以Si (1 ≤ Si ≤ 1,000,000) km/h的速度飞驰 为了避免相撞 ...
- 数据库MySQL--数据操作语言DML(插入、修改、删除)
例子文件:https://files-cdn.cnblogs.com/files/Vera-y/girls.zip 一.插入 方式一: 语法: insert into 表名(列名,.....) val ...
- 分布式唯一ID实现
ID生成的核心需求 全局唯一 趋势有序 为什么要全局唯一 避免ID冲突 著名的例子就是身份证号码,身份证号码确实是对人唯一的,然而一个人是可以办理多个身份证的,例如你身份证丢了,又重新补办了一张,号码 ...
- [190308]Ubuntu 安装完之后,安装的软件小记
install software vim sudo apt-get install -y vim Typora command copy from Typora website # or run: # ...
- 2019.12.04 Java中的内存分配
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...
- ubuntu下安装git提示无root权限
apt-get install git 获取git指令 sudo passwd root 重置unix密码 su root 键入密码 参考链接 https://www.cnblogs.com/2she ...