Educational Codeforces Round 80 (Rated for Div. 2)(C - Two Arrays )


C - Two Arrays

題目鏈接:https://codeforces.com/contest/1288/problem/C

題目:

    

 

 

 

 題意:給你n,m,利用1~n之間的數(可重復)來組成長度為m的數組a,b,要求數組a非遞減,數組b非遞增,且a數組的數《=b數組中的數,求出a,b數組對數

 思路:用動態規划,dp[i][j]是第i個位置放數字j的方案數,根據題意可以將b數組反置然后接在a后面,則該數組長度為2m,為一個非遞減序列,則就是求1~n這些數字可重復組成多少種長度為2m的非遞減序列,可發現在第i位置放j-1必然在第i-1位置放j數字,所以可以得出狀態方程dp[i][j]=dp[i-1][j]+dp[i][j-1].

//
// Created by HJYL on 2020/1/14.
//
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
const int mod=1e9+7;
int main()
{
    //freopen("text","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    int dp[100][maxn];
    for(int i=1;i<=n;i++)
        dp[1][i]=1;//dp初始化
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=n;j++) {
            dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;//dp[i][j]表示第i位置放數字j的方案數,在i位置放j-1情況時必然i-1位置也能放j
        }
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
        res+=dp[2*m][i];//在該長度為2m數組中最后一個位置放1~n的情況之和
        res%=mod;
    }
    printf("%d\n",res);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM