Educational Codeforces Round 80 (Rated for Div. 2)

Educational Codeforces Round 80 (Rated for Div. 2)

C . Two Arrays
  • 题意:用n个数字(1~n),构造两个长度为m的序列满足以下条件:

    • \(a_{i} \le b_{i} (1 \le i \le m)​\)
    • a序列不递减
    • b序列不递增

    问有多少种方案?

  • 分析:

    • 根据a不递减,b不递增,且\(a_{i} \le b_{i} (1 \le i \le m)\) 的条件,我们可以得出如果将b序列反向加在a序列后面构成新的序列,这个序列一定是非递减的。所以问题转为2*m的序列,用n个数构成非递减序列的方案数。DP。
    • \(dp[i][j]\)表示第 i 个位置放 j 数的方案数,显然它等于前面 i - 1 位放 k (\(k \le j\)) 的方案数之和。
  • 代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int MA=1e3+5;
    const int P=1000000007;
    
    ll dp[MA][MA];
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)dp[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){
                    dp[i][j]=(dp[i][j]+dp[i-1][k])%P;
                }
            }
        }
        ll ans=0;
        for(int i=1;i<=n;++i){
            ans=(ans+dp[2*m][i])%P;
        }
        printf("%lld\n",ans);
        return 0;
    }
    
    
posted @ 2020-01-15 08:11  A_sc  阅读(197)  评论(0)    收藏  举报