1288C Two Arrays
题意:
两个长度为M的序列a和b,要求里面每个数字都在1和N之间,同时a数组不递减,b数组不递增,并且对于所有元素,a(i)<b(i),询问有多少种这样的ab序列,结果对1e9+7取模
题解:
翻转b序列,并与a序列合并,就是一个长度为2*M的严格不递减的序列,问题转化为求这个序列有多少种。
开一个二维dp数组,表示第i位后面放大于等于j的数字的方案数,然后推导状态转移方程:
dp(i)(j)=dp(i)(j+1)+dp(i-1)(j)
时间复杂度是O(M*N)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e3+100; const int mod=1e9+7; ll dp[maxn<<1][maxn]; //dp[i][j]表示第i个位置可以放大于等于j的方案数 int main () { int N,M; scanf("%d%d",&N,&M); for (int i=1;i<=N;i++) dp[1][i]=1; for (int i=2;i<=2*M;i++) { for (int j=N;j>=1;j--) dp[i][j]=(dp[i][j+1]+dp[i-1][j])%mod; } ll ans=0; for (int i=1;i<=N;i++) ans+=dp[2*M][i],ans%=mod; printf("%lld\n",ans); }