CF1178F1 Short Colorful Strip 题解
xuantianhao · · 题解
Short Colorful Strip
考虑设
我们找到
设最终在位置
或许你会以为这意味着
但是,这样是错误的,因为当
我们考虑拆开
则
特殊定义一下,对于
上面的转移是
前后两个括号内的内容互不干涉,故可以分开计算。
复杂度
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int N=510;
int n,m;
int num[N],f[N][N];
inline int read(){
char c=getchar();int f=1,x=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++) num[i]=read();
for(int i=1;i<=n+1;i++)for(int j=0;j<i;j++) f[i][j]=1;
for(int i=1;i<=n;i++) f[i][i]=1;
for(int l=2;l<=n;l++){
for(int i=1,j=i+l-1;j<=n;i++,j++){
int x=i,A=0,B=0;
for(int k=i;k<=j;k++) if(num[k]<=num[x]) x=k;
for(int k=x;k>=i;k--) (A+=(1LL*f[i][k-1]*f[k][x-1]%mod))%=mod;
for(int k=x;k<=j;k++) (B+=(1LL*f[x+1][k]*f[k+1][j]%mod))%=mod;
f[i][j]=1LL*A*B%mod;
}
}
printf("%d\n",f[1][n]);
return 0;
}