题目链接: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; }