cf 1288 补题

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;
}  

猜你喜欢

转载自www.cnblogs.com/w-w-t/p/12215257.html
今日推荐