Yet Another Problem On a Subsequence CodeForces - 1000D
原题链接
考察:计数dp
思路:
这dp真心还算好想,可本蒟蒻是fw.令\(f[i]\)为首项为\(a[i],长度为a[i]+1的个数\)
(1) a[1] = k-1的幸运序列.\(f[i] = C_{n-i}^{a[i]}\)
(2) 拼凑的序列,这里不是区间dp,我们考虑一个幸运序列至少可以拆成俩个序列,那么\(f[i] = C_{j-i-1}^{a[i]}*f[j]\)
Code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1010,M = 998244353;
int n,a[N],C[N][N],f[N],ans;
void init()
{
for(int i=0;i<N;i++)
for(int j=0;j<=i;j++)
if(!j) C[i][j] = 1;
else C[i][j] = (C[i-1][j-1]+C[i-1][j])%M;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
init();
for(int i=n;i>=1;i--)
{
if(a[i]<=0||a[i]>n) continue;
f[i] = C[n-i][a[i]];
for(int j=i+1;j<=n;j++)
if(a[j]>0)
f[i] = (f[i]+(LL)C[j-i-1][a[i]]*f[j]%M)%M;
ans = ((LL)ans+f[i])%M;
}
printf("%d\n",ans);
return 0;
}