1288C Two Arrays

题意:

两个长度为M的序列a和b,要求里面每个数字都在1和N之间,同时a数组不递减,b数组不递增,并且对于所有元素,a(i)<b(i),询问有多少种这样的ab序列,结果对1e9+7取模

题解:

翻转b序列,并与a序列合并,就是一个长度为2*M的严格不递减的序列,问题转化为求这个序列有多少种。

开一个二维dp数组,表示第i位后面放大于等于j的数字的方案数,然后推导状态转移方程:

dp(i)(j)=dp(i)(j+1)+dp(i-1)(j)

时间复杂度是O(M*N)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+100;
const int mod=1e9+7;
ll dp[maxn<<1][maxn];
//dp[i][j]表示第i个位置可以放大于等于j的方案数 
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=N;j>=1;j--)
            dp[i][j]=(dp[i][j+1]+dp[i-1][j])%mod;
    } 
    ll ans=0;
    for (int i=1;i<=N;i++)
        ans+=dp[2*M][i],ans%=mod;
    printf("%lld\n",ans);
}

 

posted @ 2020-04-03 14:46  zlc0405  阅读(151)  评论(0编辑  收藏  举报