Two Arrays
思路
我们可以把两个序列链接起来,有 (a_1 <= a_2 …… <= a_n <= b_1 <= b_2 …… <= b_n)
这里就构成了一个非递减的序列,长度是 (2m) 我们定义数组 (dp[i][j]) 表示的是第i位是j的数量,显然有
(dp[i][j] = sum limits ^{j} _{k = 1} dp[i - 1][k]),再通过观察我们可以优化一下(dp[i][j] = dp[i - 1][j] + dp[i][j - 1])
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int dp[30][1010], n, m;
int main() {
scanf("%d %d", &n, &m);
m <<= 1;
for(int i = 1; i <= n; i++) dp[1][i] = 1;
for(int i = 2; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % mod;
ll ans = 0;
for(int i = 1; i <= n; i++)
ans = (ans + dp[m][i]) % mod;
printf("%lld
", ans);
return 0;
}