C题题意:
给你两个数n,m ; m为数组长度,数组内的数据范围为1到n。
- 对任意i,有a[i] <= b[i]
- 数组a为非降序
- 数组b为非升序
结果可能非常大,您应该以10^9+7模数打印它。
Input
n m (1≤n≤1000, 1≤m≤10).
Output
打印一个整数-满足上述条件的数组a和b的个数对10^9+7取模的结果。
分析:
分析一下题目,a[i]<=b[i]
数组a为非降序,则a1为最小的数
数组b为非升序,则b1为最大的数
则将b数组倒序(b就变为非降序了),和a数组形成了一个非降序的c数组
问题就变成了,求在1到n中有多少个满足条件的c数组
dp[i] [j]指的是对于数组长度为i,且最后一位为j并满足条件的个数
则最后结果sum为dp[2*m] [j] 从1到 n 之和
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MA=10005;
const int mod=1e9+7;
ll dp[MA][MA];
int main(){
int n,m;
cin>>n>>m;
for(int j=1;j<=n;j++){
dp[1][j]=1;
}
for(int i=2;i<=2*m;i++){
for(int j=1;j<=n;j++){
for(int k=j;k>=1;k--){
dp[i][j]+=dp[i-1][k];
dp[i][j]%=mod;
}
}
}
ll sum=0;
for(int j=1;j<=n;j++){
sum+=dp[2*m][j];
sum%=mod;
}
cout<<sum<<endl;
return 0;
}