\(首先很容易想到一个O(n^4m)的DP\)

\(设dp\ [i]\ [j]\ [q]\ 为长度i,a数组以j结尾,b数组以q结尾(q>=j)\)

        for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
dp[1][i][j]=1;//初始化长度为1的时候
for(int i=2;i<=m;i++)
for(int j=1;j<=n;j++)
for(int q=j;q<=n;q++)
for(int w=1;w<=j;w++)//升序
for(int e=q;e<=n;e++)//降序
dp[i][j][q]=(dp[i-1][w][e]+dp[i][j][q])%mod;

\(然而复杂度炸上了天,那就要另辟蹊径。\)

\(\color{Red}{一、合并两个数组DP以降低复杂度}\)

\(上面DP的慢,是因为每次都要枚举a和b数组最后一个数\)

\(但是b数组逆序接在a数组,可以发现就是一个不降序数组,就是求长度2*m的不降序数组个数。\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,m,ans;
ll dp[21][1001];
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=1;j<=n;j++)
{
for(int q=1;q<=j;q++)
dp[i][j]=(dp[i][j]+dp[i-1][q])%mod;
if(i==2*m) ans=(ans+dp[i][j])%mod;
}
cout<<ans;
}

\(\color{Purple}{Ⅱ.还有组合数学的解法。[当然不是我想的┭┮﹏┭┮]}\)

\(仍然要注意到b的最小元素(尾元素)不小于a的最大元素(尾元素)\)

\(因为a不下降,b不上升,那么给定2m个数,有且仅有1种方案组成符合条件的a,b数组\)

\(也就是说,从1-n选2m个数,可以选重复的,问有多少种选法??\)

\(也就是说,把2m个小球投到1-n个盒子,盒子可以为空,有多少种投法。\)

\(为了方便,先把n个盒子都放一个苹果,也就是2*m+n放在n个盒子,每个盒子至少放一个\)

\(这样就可以用隔板法。2*m+n-1个间隙,从中选出n-1个间隙放隔板,就分成了n份。\)

\(答案是C_{2*m+n-1}^{n-1}\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,m,ans;
ll fac[2001];
ll qpow(ll a,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
ll C(ll n,ll m)
{
if(m>n) return 0;
return fac[n]*qpow(fac[m],mod-2)%mod*qpow(fac[n-m],mod-2)%mod;
}
ll Lucas(ll n,ll m)
{
if(!m) return 1;
return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}
int main()
{
cin>>n>>m;
fac[0]=1;
for(ll i=1;i<=2000;i++) fac[i]=(fac[i-1]*i)%mod;
cout<<Lucas(2*m+n-1,n-1);
}

C. Two Arrays(思维DP或组合数学)的更多相关文章

  1. Atcoder Grand Contest 037B(DP,组合数学,思维)

    #include<bits/stdc++.h>using namespace std;const long long mod = 998244353;string s;int a[3000 ...

  2. codeforces 1288C. Two Arrays(dp)

    链接:https://codeforces.com/contest/1288/problem/C C. Two Arrays 题意:给定一个数n和一个数m,让构建两个数组a和b满足条件,1.数组中所有 ...

  3. D - Yet Another Problem On a Subsequence CodeForces - 1000D (DP,组合数学)

    D - Yet Another Problem On a Subsequence CodeForces - 1000D The sequence of integers a1,a2,-,aka1,a2 ...

  4. T2960 全民健身【思维Dp,预处理,差分优化】

    Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...

  5. CF1288C-Two Arrays (DP)

    You are given two integers n and m. Calculate the number of pairs of arrays (a,b) such that: the len ...

  6. hdu 4661 Message Passing(木DP&amp;组合数学)

    Message Passing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  7. 【做题】CSA49F - Card Collecting Game——思维&dp

    原文链接 https://www.cnblogs.com/cly-none/p/CSA49F.html 题意:Alice和Bob在玩游戏.有\(n\)种卡牌,每种卡牌有\(b_i\)张,保证\(\su ...

  8. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  9. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

随机推荐

  1. CentOS7安装JAVA环境

    安装JAVA环境我常用的有两种形式 1.下载tar包安装 2.下载rpm包直接安装 本篇内容就写这两种形式的安装方法: JAVA程序的下载地址:https://www.oracle.com/java/ ...

  2. Maven版本不合适导致出现的问题如下,换个老版本就好了

    2019-09-30 11:56:24,555 [ 597097] ERROR - #org.jetbrains.idea.maven - IntelliJ IDEA 2018.3.5 Build # ...

  3. CNVD

    漏洞编号 漏洞名称 漏洞积分 奖励时间 CNVD-2020-15798 中国平乐县委员会组织部网站管理系统登录存在弱口令漏洞 1.0 2020-03-09 09:58:46.0 CNVD-2020-1 ...

  4. 【python实现卷积神经网络】池化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  5. Python 小技之实现的鲜花盛宴,你准备好了吗?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:派森酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  6. L23模型微调fine tuning

    resnet185352 链接:https://pan.baidu.com/s/1EZs9XVUjUf1MzaKYbJlcSA 提取码:axd1 9.2 微调 在前面的一些章节中,我们介绍了如何在只有 ...

  7. 详解PHP反序列化中的字符逃逸

    首发先知社区,https://xz.aliyun.com/t/6718/ PHP 反序列化字符逃逸 下述所有测试均在 php 7.1.13 nts 下完成 先说几个特性,PHP 在反序列化时,对类中不 ...

  8. vue路由中 Navigating to current location ("/router") is not allowed

    报错原因:多次点击同一路由,导致路由被多次添加 解决方法: router/index中添加以下代码: //router/index.js Vue.use(VueRouter) //导入vue路由 co ...

  9. 用多线程,实现并发,TCP

    首先,开启新的线程,是不会新开辟内存空间的,即,子线程和主线程 都在同一个进程里,也就是主进程里,用os.pid(),os.ppid() 服务器: 方式一:Thread实例化 def task(con ...

  10. TensorFlow1.0 线性回归

    import tensorflow as tf import numpy as np #create data x_data = np.random.rand(100).astype(np.float ...