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;
}
posted @ 2020-10-28 19:53  LT-Y  阅读(142)  评论(0)    收藏  举报