codeforce 1288C Two Arrays 思维/dp

题目大意:给出两个数n和m,构造两个数列,满足:
1.数列a单调不递减,b数列单调不递增
2.ai>=bi
3.长度都要为m

这里我们拆解一下条件,根据第一条和第二条,保证了am<=bm,然后把这两个数列粘贴在一起,就可以形成了一个单调非递减的数列,长度为2*m,用dp[i][j] = dp[i-1][j]+dp[i][j+1] 来统计情况。

#include<bits/stdc++.h>
using namespace std;
const int maxx = 1050;
const int mod = 1e9+7;
long long dp[maxx<<1][25];
int n,m;
int main ()
{
    cin>>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>0;j--){
            dp[i][j] = dp[i-1][j]+dp[i][j+1]%mod;
        }
    }
    long long ans = 0;
    for(int i = 1;i<=n;i++){
        ans=(ans+dp[2*m][i])%mod;
    }
    cout<<ans<<endl;
    return 0;
}

发布了22 篇原创文章 · 获赞 4 · 访问量 529

猜你喜欢

转载自blog.csdn.net/yp0413170331/article/details/104074797