zoukankan      html  css  js  c++  java
  • ZROI2018普转提day2t1

    传送门

    分析

    我们通过仔细研究不难发现对于一次交换(i,i+1)的操作之后,在i之前的点就不可能跑到i之后,i+1之后的的点也不可能跑到i+1之前,所以这个序列在一次交换之后就相当于被分成了两个部分。于是我们设dp[n][low]表示对于一个长度为n的最小值为low的序列的构成方案数。于是我们可以求出dp[n][low]=dp[i][low]*dp[n-i][low+i]*C(n-2,n-i-1)(i∈(1,n)且此情况合法)。C(n-2,n-i-1)表示在交换这一次之前共要进行n-2次交换,其中n-i-1次是在左边交换,因为选的左右顺序不同是不同的方案,所以要乘上这个值。而至于判断i是否合法见代码。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    const long long mod = 1e9+7;
    long long p[110],dp[110][110],N,c[110][110];
    inline void getc(){
          long long i,j,k;
          for(i=0;i<=50;i++)c[i][0]=c[i][i]=1;
          for(i=1;i<=50;i++)
            for(j=1;j<i;j++)
              c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    }
    inline long long go(long long n,long long low){
          if(dp[n][low]!=-1)return dp[n][low];
          if(n==1)return dp[n][low]=1;
          long long i,j,k,cnt=0,now[110];
          for(i=1;i<=N;i++)if(p[i]>=low&&p[i]<low+n)now[++cnt]=p[i];
          dp[n][low]=0;
          for(i=1;i<n;i++){
              bool ok=1;
              swap(now[i],now[i+1]);
              for(j=1;j<=i;j++)if(now[j]>=low+i){ok=0;break;}
              if(ok){
                dp[n][low]=(dp[n][low]+
                go(i,low)*go(n-i,low+i)%mod*c[n-2][i-1]%mod)%mod;
              }
              swap(now[i],now[i+1]);
          }
          return dp[n][low];
    } 
    int main(){
          long long i,j,k;
          memset(dp,-1,sizeof(dp));
          scanf("%lld",&N);getc(); 
          for(i=1;i<=N;i++)scanf("%lld",&p[i]);
          printf("%lld
    ",go(N,0));
          return 0;
    }
  • 相关阅读:
    IDEA常用快捷键
    IDEA的使用
    IDEA的常用设置
    IDEA的下载安装
    004-解决多线程安全问题
    002-多线程的创建
    Java中字符串与日期之间的转换
    select标签的字体居中问题
    IntelliJ IDEA常用快捷键
    div小技巧之子元素垂直居中
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9688134.html
Copyright © 2011-2022 走看看