C - 数组构造
描述
给你两个整数n,m,求有多少对数组(a,b)满足如下条件
1:数组a,b的长度都为mm。
2:数组a,b中的元素处于1到n之间。
3:a数组非降序排列。
4:b数组非升序排列。
5:满足\({ai \leq bi ( 1 \leq i \leq m )}\)
输入
仅一行包含两个整数n和m。
输出
输出一个整数,表示满足上述条件的数组a和b的对数,数据较大,模\({10^9+7}\)。
样例
2 2
5
10 1
55
提示
对于20%的数据:\({1 \leq n \leq 10, 1 \leq m \leq 5}\)
对于50%的数据:\({1 \leq n \leq 30 , 1 \leq m \leq 5}\)
对于100%的数据:\({1 \leq n \leq 10^3, 1 \leq m \leq 10}\)
题解
需要枚举:
1. 第i个位置
2. 第i个位置上bi的值
3. 确定好‘2’后,第i个位置上ai的值
dp[i][j]:
前i个数 j为bi上的值
CODE
AC代码
#include <bits/stdc++.h>
using namespace std;
const int mode = 1e9 + 7;
#define rep(a, b, c) for(int a = b; a <= c; a++)
#define dep(a, b, c) for(int a = b; a >= c; a--)
int n, m, dp[22][1001];
int main(){
scanf("%d%d", &n, &m);
rep(i, 1, n){
dp[1][i] = 1;
}
rep(i, 1, m * 2){//枚举前i,有2个串 乘个2
rep(j, 1, n){//枚举b
rep(k, j, n){//枚举a
dp[i + 1][j] = (dp[i + 1][j] + dp[i][k]) % mode;
}
}
}
int ans = 0;
rep(i, 1, n){
ans = (ans + dp[2 * m][i]) % mode;
}
printf("%d\n", ans);
return 0;
}
没有未来的未来不是我想要的未来

浙公网安备 33010602011771号