AC
2023-07-18 14:54:05
发布于:广东
15阅读
0回复
0点赞
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Rg register
#define RI Rg int
#define Cn const
#define CI Cn int&
#define I inline
#define W while
#define N 5000
#define X 1000000007
using namespace std;
int n,a[N+5],c[2],q[2][N+5],f[N+5][N+5],p[N+5][N+5];
int main()
{
RI Tt,i,j,mn,mx;scanf("%d",&Tt);W(Tt--)
{
for(scanf("%d",&n),c[0]=c[1]=0,i=1;i<=n;++i) scanf("%d",a+i),q[a[i]&1][++c[a[i]&1]]=i;//按奇偶性分成两部分
for(i=1;i<=n;++i) for(mn=mx=a[i],j=i;j<=n;++j)//预处理两个数顺序能否改变
mn=min(mn,a[j]),mx=max(mx,a[j]),p[i][j]=abs(a[i]-a[j])<=1&&min(a[i],a[j])-mn<=1&&mx-max(a[i],a[j])<=1;//它们相差1;中间都与某个相差1
for(i=0;i<=c[0];++i) for(j=0;j<=c[1];++j) f[i][j]=0;//清空
#define OK(x,y) (x<y||p[y][x])//判断y能否在x后面
for(f[0][0]=1,i=0;i<=c[0];++i) for(j=0;j<=c[1];++j)
i^c[0]&&(!j||OK(q[1][j],q[0][i+1]))&&(f[i+1][j]=(f[i+1][j]+f[i][j])%X),//尝试填偶数
j^c[1]&&(!i||OK(q[0][i],q[1][j+1]))&&(f[i][j+1]=(f[i][j+1]+f[i][j])%X);//尝试填奇数
printf("%d\n",f[c[0]][c[1]]);
}return 0;
}
全部评论 2
勇闯无人区 6
2023-07-29 来自 广东
06
2023-07-19 来自 广东
0
有帮助,赞一个