题目链接:https://codeforces.ml/contest/1366/problem/E
题目大意:有一个长为n的a数组,和长为m的b数组。问有多少种方案把a数组分成m块。第i块的最小值对应b[i],b数组保证递增。
思路:用dp[i]:组成b数组前i个数的方案数。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=998244353;
int a[200005], b[200005], f[200005];
map<int, int> mp;
int main() {
int n, m; scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
}
for(int i=1; i<=m; i++){
scanf("%d", &b[i]);
mp[b[i]]=i;
}
for(int i=n-1; i>=1; i--){
a[i]=min(a[i], a[i+1]);
}
if(b[1]!=a[1]){
printf("0\n", f[m]);
return 0;
}
f[1]=1;
for(int i=1; i<=n; i++){
if(!mp[a[i]]||mp[a[i]]==1) continue;
int pos=mp[a[i]];
f[pos]=(f[pos]+f[pos-1])%mod;
}
printf("%d\n", f[m]);
return 0;
}
京公网安备 11010502036488号