Two Arrays
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\n", ans);
return 0;
}