By Bartholomew
其实不要小看一道地精部落,有比较大的思维量在里面!
小结论:
我们首先知道 3 个性质:
如果有想看证明的,请自动转到代码片下面,因为考虑有些人不想看证明
FirstFirst:
对于每一个 数字 i 和 i+1 , 如果这两个数不是相邻的,那么交换两个数字的对应的方案数是一样的!
比如有 波动序列 3241532415 和 1243512435
SecondSecond:
我们由 1~n 的波动数列的任意一种,将每一个 aiai 都可以用(n+1) 减去,那么得到的新的序列其实还是合法的,而且相对的山谷和山峰会改变!
比如有 波动序列 3241532415 和 3425134251
ThirdThird:
波动数列具有对称性……
DP转移:
其实就是变成了 dp[i][j]=dp[i][j]= dp[i−1][j]+dp[i−1][j]+ dp[i−1][i+1−j]dp[i−1][i+1−j]
dp[i][j]dp[i][j] 表示可以 用 当前离散化之后的1~i 号的以jj为开头的山峰的方案个数
我们可以思考一下:
一.
我们假设有 与 j+1j+1 并不相邻—>那么我们就是方案数为 dp[i−1][j]dp[i−1][j]
为什么?
因为dp[i][j−1]dp[i][j−1] 表示的是 将j放入第一个的方案数,而且 j−1j−1就是山峰,那么我们就知道了jj肯定不是第二个,那么这样就不是山峰了!
二.
如果jj 与 是相邻的,那么此时的方案数就是 dp[i+1-j]
因为我们可以考虑就是 jj , , ????...????...
那么就是相当于转换成了 11~ 的数字 j−1j−1 为山谷的情况了! 因为 j>j−1j>j−1那么j-1 的右边只能是 比j−1j−1 要大的数字,也就是它是山谷的时候了!
那么我们根据性质二可以知道就是等同于 给你 [1,j−1]U[j+1,i][1,j−1]U[j+1,i]的数,让你求以 j−1j−1 为开头的山谷的方案数.那么其实又可以发现[j+1,i][j+1,i] 的数 其实也就是相当于 [j,i−1][j,i−1] ,可以自行思考一发!
那么就是求 1~i-1 以 j−1j−1 为开头的山谷的方案数. 也就是同时 用 i−1+1i−1+1 减去之后的方案数,即 dp[i-1][i-1+1-(j-1)] = dp[i-1][i+1-j]的方案数.!
代码:
用了滚动数组!
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 4201
#define N 1000050
#define INF 0x3f3f3f3f
#define P pair<int,int>
#define ll long long
using namespace std;
int n,MOD,dp[2][MAXN];
inline ll read()
{
ll x=0;
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){if(c=='-')flag=1; c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?-x:x;
}
int main(int argc,char const* argv[])
{
n = read(); MOD = read();
dp[0][2] = 1;
for(register int i=3;i<=n;++i)
for(register int j=1;j<=i;++j)
dp[i&1][j] = (dp[i&1][j - 1] + dp[(i-1)&1][i-j+1]) % MOD;// dp[i-1][i-j+1] = dp[i-1][(i-1+1) - (j-1)];
int ans = 0;
for(int i=2;i<=n;i++) ans = (ans + dp[n&1][i])%MOD;
printf("%d",(ans<<1) % MOD);
return 0;
}
证明:
First:First:
比如有 j ….. j+1
那么他们左右的数字要么是比 j-1 要小 要么是比 j+1要大,那么我们列一列情况会发现没有什么不合法的情况
Second:Second:
意会一下…
Third:Third:
意会一下…