C. Two Arrays

题意:你被给予了两个整数n和m,计算两个数组对a,b的个数,如下:
(a,b)是如下的两个数组
1.两个数组的长度都是m
2.数组中每一个整数都是1到n
3.\(ai \leq bi\)对于索引i来说(1~m)
4.数组a是一个非降的序列
5.数组b是一个非升的序列

分析:我们可以发现,数组b逆序接在a的后面,依然是一个非降的序列,那么我们可以采用DP来求解方案数,f[i][j]表示长度为i,结尾数字为j的方案数,那么所有可以达到这个状态的状态为f[i - 1][1~j]的所有方案累加起来。

#include 
#include 
#include 
#include 

using namespace std;
using LL = long long;
const int mod = 1e9 + 7;
const int M = 30;
const int N = 1005;
int f[M][N];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
        f[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)
                f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
        }
    }

    LL res = 0;
    for (int i = 1; i <= n; ++i)
        res = (res + f[2 * m][i]) % mod;

    printf("%lld", res);

    return 0;
}


你可能感兴趣的:(C. Two Arrays)