zoukankan      html  css  js  c++  java
  • Codeforces 1288C

    题目大意:

    给定n和m,有两个数组,两个数组的长度都等于m

    数组内每个元素都在1到n中

    对于两个数组对应的位置i,必须满足a[i]<=b[i]

    a数组必须是不下降的序列

    b数组必须是不上升的序列

    求有多少种ab数组的排列方案满足上述题意

    解题思路:

    因为a不下降,b不上升,所以a总体呈上升趋势(或趋平),b总体呈下降趋势(或趋平)

    所以只要满足a[m]<=b[m]即可让这个序列方案满足题意

    或者说,将a数组左右对称后拼接在b数组后面,使得整个数组完全呈严格下降趋势的时候,即可满足题意

    因此进行动态规划,令dp[i][j]表示第i个元素值为j时的方案数

    对于整个数组全是最大值n的情况,显而易见只有一种方案数,所以dp[1~2m][n]=1

    其后,第一个元素值为j时,方案数明显只有1;第i个元素值为j时,方案数为第i-1个元素为j时的方案数加上第i个元素为j+1时的方案数相加得到

    故得到状态转移方程为

    dp[i][j]=dp[i-1][j]+dp[i][j+1]

    最后取答案时,累加dp[2m][1~n]的所有方案数即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=1000000007;
    ll dp[25][2010];
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        ll n,m,i,j,ans=0;
        cin>>n>>m;
        for(i=1;i<=2*m;i++)
            dp[i][n]=1;
        for(j=n-1;j;j--){
            dp[1][j]=1;
            for(i=2;i<=2*m;i++)
                dp[i][j]=(dp[i-1][j]+dp[i][j+1])%mod;
        }
        for(j=n;j;j--)
            ans=(ans+dp[2*m][j])%mod;
        cout<<ans;
        
        return 0;
    }
  • 相关阅读:
    02_Python基础
    python 学习网站
    Docker搭建MySQL服务
    Ubuntu源、Python虚拟环境及pip源配置
    Ubuntu18.04完全卸载mysql5.7并安装mysql8.0的安装方法
    MySQL 数据库
    数据库连接池
    ssm整合开发的相关步骤和增删改查
    Springmvc执行流程
    资源映射之----在springmvc中如何访问WEB-INF目录下的文件和系统文件夹中的文件
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12221330.html
Copyright © 2011-2022 走看看