Educational Codeforces Round 80 (Rated for Div. 2)
Educational Codeforces Round 80 (Rated for Div. 2)
C . Two Arrays
-
题意:用n个数字(1~n),构造两个长度为m的序列满足以下条件:
- \(a_{i} \le b_{i} (1 \le i \le m)\)
- a序列不递减
- b序列不递增
问有多少种方案?
-
分析:
- 根据a不递减,b不递增,且\(a_{i} \le b_{i} (1 \le i \le m)\) 的条件,我们可以得出如果将b序列反向加在a序列后面构成新的序列,这个序列一定是非递减的。所以问题转为2*m的序列,用n个数构成非递减序列的方案数。DP。
- \(dp[i][j]\)表示第 i 个位置放 j 数的方案数,显然它等于前面 i - 1 位放 k (\(k \le j\)) 的方案数之和。
-
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MA=1e3+5; const int P=1000000007; ll dp[MA][MA]; 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=1;j<=n;++j){ for(int k=1;k<=j;++k){ dp[i][j]=(dp[i][j]+dp[i-1][k])%P; } } } ll ans=0; for(int i=1;i<=n;++i){ ans=(ans+dp[2*m][i])%P; } printf("%lld\n",ans); return 0; }

浙公网安备 33010602011771号