题意:你被给予了两个整数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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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;
}