题目大意

  求在$[1,n]$的排列中是波动序列的数量。

题解

性质

  当我们对波动序列$a$进行以下操作时,得到的新序列仍然是个波动序列:

  1. 若$a_i = a_j+1且|j-i|>1$,将$a_i,a_j$交换。
  2. 将波动序列上下翻转(也就是$\forall a_i, a_i\rightarrow n-a_i +1$)。
  3. 将波动序列左右翻转(也就是$\forall a_i, a_i\rightarrow a_{n-i+1}$)。

  另外有性质1:对于任意一个长度为$n$,数值两两不同,且数值取值范围固定但不限于$[1,n]$的波动序列$a$,它的种类数与长度为$n$,数值取值等于$[1,n]$的序列的种类数是相同的。

状态的设计

  由操作3我们可以想到:若我们规定每个波动序列的第一个数字都是山峰,那么最后我们的结果就是这些波动序列的数量*2,所以我们要用$j$表示第一个数字为$j$且它为山峰;因为一个波动序列的每一个子序列都满足性质1,所以我们要用$i$来表示波动序列长度为$i$,且数值取值范围等于$[1,i]$的结果。$f$表示这样的种类。状态$f(i,j)$就出来了。

状态的转移

  由序列中元素$a_1$与$a_2$的关系分两种情况。

  • 若$a_2<a_1-1$,对$a_1$该值操作1,得到$f(i,j-1)$。
  • 若$a_2=a_1-1$,将子序列$[2,n]$内的元素由性质1可以对应到一个长度为$i-1$取值范围等于$[1,i-1]$的波动序列,将该序列进行操作2,得到$f(i-1,i-j+1)$

  所以最后的递推式为$f(i,j)=f(i,j-1)+f(i-1,i-j+1)$

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define F(i, j) Dp[(i) & 1][j]
const int MAX_N = 5000;
long long Dp[2][MAX_N], P;
int N; long long DP()
{
F(2, 2) = 1;
for (int i = 3; i <= N; i++)
{
memset(Dp[i & 1], 0, sizeof(Dp[i & 1]));
for (int j = 2; j <= i; j++)
F(i, j) = (F(i, j - 1) + F(i - 1, i - j + 1)) % P;
}
long long ans = 0;
for (int i = 2; i <= N; i++)
ans = (ans + F(N, i)) % P;
return (ans * 2) % P;
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
scanf("%d%lld", &N, &P);
printf("%lld\n", DP());
return 0;
}

  

最新文章

  1. JavaScript可否多线程? 深入理解JavaScript定时机制
  2. sklearn 组合分类器
  3. 树形DP求树的重心 --SGU 134
  4. Linux(Redhat)下redis安装
  5. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
  6. 2014年2月份第3周51Aspx源码发布详情
  7. ssh 连接ubuntu的虚拟机问题
  8. hdu 5532 Almost Sorted Array
  9. CoreAnimation 核心动画一 (一些常用属性 和 方法)
  10. 开发库比较(3) - Mobile Web 开发 - Sencha, jquerymobiel, phonejs, jqtouch, jqmobi
  11. FD.io vpp 框架转发图
  12. JavaScript的三种类型检测typeof , instanceof , toString比较
  13. ES6(阮一峰)学习总结
  14. 分析解剖微服务系列(二)-SOA和微服务异同
  15. ubuntu不能联网的问题
  16. Running ROS on Windows 10
  17. python_11 装饰器,闭包
  18. Java 异常与反射 总结
  19. python中print和input的底层实现
  20. 第25月第3天 Mxshop项目记录01

热门文章

  1. (转)Hibernate的一级缓存
  2. post发送数据 mypost input 改变事件
  3. Linux cat 命令
  4. Unity如何播放带有alpha 通道的视频
  5. 考试T1总结(又CE?!)
  6. Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage
  7. ModelBinder 请求容错性
  8. 1、DataGridView
  9. Sort HDU5884(二分+多叉哈夫曼树)
  10. 46.颜色+品牌下钻分析时按最深层metric进行排序