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

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

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

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

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

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

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=1e9+7;
  5. ll n,m,ans;
  6. ll dp[21][1001];
  7. int main()
  8. {
  9. cin>>n>>m;
  10. for(int i=1;i<=n;i++) dp[1][i]=1;
  11. for(int i=2;i<=2*m;i++)
  12. for(int j=1;j<=n;j++)
  13. {
  14. for(int q=1;q<=j;q++)
  15. dp[i][j]=(dp[i][j]+dp[i-1][q])%mod;
  16. if(i==2*m) ans=(ans+dp[i][j])%mod;
  17. }
  18. cout<<ans;
  19. }

\(\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}\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=1e9+7;
  5. ll n,m,ans;
  6. ll fac[2001];
  7. ll qpow(ll a,ll n){
  8. ll ans=1;
  9. while(n){
  10. if(n&1) ans=ans*a%mod;
  11. a=a*a%mod;
  12. n>>=1;
  13. }
  14. return ans;
  15. }
  16. ll C(ll n,ll m)
  17. {
  18. if(m>n) return 0;
  19. return fac[n]*qpow(fac[m],mod-2)%mod*qpow(fac[n-m],mod-2)%mod;
  20. }
  21. ll Lucas(ll n,ll m)
  22. {
  23. if(!m) return 1;
  24. return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
  25. }
  26. int main()
  27. {
  28. cin>>n>>m;
  29. fac[0]=1;
  30. for(ll i=1;i<=2000;i++) fac[i]=(fac[i-1]*i)%mod;
  31. cout<<Lucas(2*m+n-1,n-1);
  32. }

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. 《MySQL实战45讲》学习笔记4——MySQL中InnoDB的索引

    索引是在存储引擎层实现的,且在 MySQL 不同存储引擎中的实现也不同,本篇文章介绍的是 MySQL 的 InnoDB 的索引. 下文将以这张表为例开展. # 创建一个主键为 id 的表,表中有字段 ...

  2. std::string 字符串分割

    #include <iostream> #include <string> #include <vector> std::vector<std::string ...

  3. AJ学IOS(41)UI之核心动画 两行代码搞定3D转场

    AJ分享,必须精品 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过 ...

  4. 【Java】 Variable 变量

    什么是Variable变量? - 变量是内存中的一个存储区域 - 这个存储区域内的数据允许在同一类型范围内不断变化 - 是程序最基本的存储单元,包含三个要素[变量类型][变量名][存储的值] 为什么需 ...

  5. 解决同层hover事件重叠闪烁问题

    完整代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. stand up meeting 1-6

    今日更新: 1.修复初始最佳战绩显示bug:  初始为击败全国0% 用户 2.挑战结果界面显示“哎,今天的饭又白吃了,回去多吃两碗###”, 去除API返回string中的“###”. 3.分享模块初 ...

  7. 利用Putty建立SSH的tunnels访问内网资源

    适用场景访问阿里或者腾讯云只针对内网开放的资源. 本文以SQLSERVER 举例 举例你的内网 SQLSERVER的访问地址是192.168.33.88 . 你的Microsoft SQL Serve ...

  8. Numpy学习-(2)

    我学习numpy过程的记录 1. 切片和索引 (1) 两种切片方式示例: (2) 多维数组: import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5 ...

  9. 解决Oracle在命令行下无法使用del等键问题

    前言: Oracle使用Linux命令行进行编辑? 有PL/SQL development,SQL development等工具,为何用Linux命令行? 但也免不了有用的的时候 以下是解决在Linu ...

  10. DMTF 关于 CIM-XML 的幻灯片介绍

    https://members.dmtf.org/data/presentations/devcon02/JimDavis-IntroductiontoCIM-XML.pdf