Two Arrays

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;
}
posted @ 2020-05-03 18:21  lifehappiness  阅读(63)  评论(0编辑  收藏  举报