「题解」:[组合数学][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$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
 
随机推荐
- LOG2_8BIT, LOG2_16BIT, LOG2_32BIT, LOG64_8BIT, LOG2
			
#define LOG2_8BIT(v) (8 - 90/(((v)/4+14)|1) - 2/((v)/2+1)) #define LOG2_16BIT(v) (8*((v)>255) + L ...
 - 高手总结CSS书写技巧
			
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果.这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack ...
 - 文本数据增量导入到mysql
			
实现思路: 实现Java读取TXT文件中的内容并存到内存,将内存中的数据和mysql 数据库里面某张表数据的字段做一个比较,如果比较内存中的数据在mysql 里存在则不做处理,如果不存在则 ...
 - 大道浮屠诀---mysql5.7.28 for linux安装
			
环境: redhat6.5 MySQL Community Server 5.7.28 https://dev.mysql.com/downloads/mysql/5.7.html 安装RMP包的具体 ...
 - 为什么学习JavaScript
			
为什么学习JavaScript 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. ...
 - Python基础知识之5——函数基础
			
函数 函数是一个独立且封闭完成特定功能的代码块,可以在任何地方被调用.Python内置了很多函数,我们可以直接调用,使用的时候,先查询下Python的官方文档即可: http://docs.pytho ...
 - sql(10)  sum
			
SUM() 函数SUM 函数返回数值列的总数(总额).SQL SUM() 语法SELECT SUM(column_name) FROM table_name新建表 StudentSS_id Grade ...
 - soj考试2
			
T1:子图 给你一棵带点权的树,对于所有i∈[1,m],问树上是否存在连通子图的权值和=i? n<=3000,m<=100000. 朴素的背包树形dp有nm的复杂度,bitset也无处优化 ...
 - CF538G Berserk Robot
			
题意:一个机器人在一个无穷大的网格图中,每秒能够上下左右走一步.它的行走方向序列是长度为l的循环.给你n个线索,包括ti:时间,xi,yi走到的坐标.让你构造出行走的方向序列? 标程: #includ ...
 - thinkphp 系统流程
			
用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导类(Think\Think ...