zoukankan      html  css  js  c++  java
  • codeforces 1288C. Two Arrays(dp)

    链接:https://codeforces.com/contest/1288/problem/C

    C. Two Arrays

    题意:给定一个数n和一个数m,让构建两个数组a和b满足条件,1.数组中所有元素的取值在1~n之间,a和b数组长度是m。2. a数组是单调不递减的,b数组是单调不递增 3. 任意的位置i,有ai<=bi

    思路:可以组合数学做,也可以dp,以下为dp做法。首先如果把a、b两个数组合并成 a1,a2,a3,.......am,bm,bm-1,bm-2,bm-3...........b3,b2,b1,会发现整个数列是单调不递减的,那么就可以dp做了,

    dp[i][j]表示第i个位置可以放 大于等于 j 的方案数 ,那么转移方程就是 dp[i][j] = dp[i-1][j] + dp[i][j+1]

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 #include<queue> 
     7 using namespace std;
     8 typedef long long ll;
     9 const int maxm = 12;
    10 const int maxn = 1e3+5;
    11 const int mod = 1e9+7;
    12 ll dp[maxm*2][maxn]; 
    13 int main(){
    14     int n,m;
    15     scanf("%d%d",&n,&m);
    16     for(int i = 1;i<=n;i++) dp[1][i] = 1;
    17     for(int i = 2;i<=2*m;i++){
    18         for(int j = n;j>=1;j--){
    19             dp[i][j] = (dp[i][j+1] + dp[i-1][j])%mod;
    20         }
    21     }
    22     ll ans = 0;
    23     for(int i = 1;i<=n;i++){
    24         ans = (ans+dp[2*m][i])%mod;
    25     }
    26     printf("%d",ans);
    27     return 0;
    28 }
  • 相关阅读:
    关于prototype属性的理解
    关于js中原型链的理解
    关于焦点轮播图的优化
    两个动画函数的分析
    JavaScript 实用技巧和写法建议
    Vue SPA 首屏加载优化实践
    带你优雅的使用 icon
    前端本地文件操作与上传
    学习webpack
    Vue 脱坑记
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12210864.html
Copyright © 2011-2022 走看看