zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    }
  • 相关阅读:
    iBatis系列一
    iBatis入手案例
    需求分析7字诀
    自我意识为王
    物联网关键技术之一
    物联网之二:传感器无线网络
    物联网之二:传感器无线网络
    物联网时代之一
    项目经理的心法
    项目管理规划
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12626445.html
Copyright © 2011-2022 走看看