zoukankan      html  css  js  c++  java
  • BZOJ4742 : [Usaco2016 Dec]Team Building

    如果我们将两个人拥有的牛混在一起,并按照战斗力从小到大排序,同时把第一个人选的牛看成$)$,第二个人选的牛看成$($的话,那么我们会发现一个合法的方案对应了一个长度为$2k$的括号序列。

    于是DP即可,$f[i][j][k]$表示考虑了前$i$头牛,目前选了$j$个左括号,括号序列的前缀和为$k$的方案数。

    时间复杂度$O(nk^2)$。

    #include<cstdio>
    #include<algorithm>
    const int N=2010,M=13,P=1000000009;
    int n,m,K,cnt,i,j,k,f[N][M][M];
    struct E{int x,y;E(){}E(int _x,int _y){x=_x,y=_y;}}a[N];
    inline bool cmp(const E&a,const E&b){return a.x==b.x?a.y<b.y:a.x>b.x;}
    inline void up(int&x,int y){x+=y;if(x>=P)x-=P;}
    int main(){
      scanf("%d%d%d",&n,&m,&K);
      while(n--)scanf("%d",&k),a[++cnt]=E(k,1);
      while(m--)scanf("%d",&k),a[++cnt]=E(k,-1);
      std::sort(a+1,a+cnt+1,cmp);
      for(f[0][0][0]=i=1;i<=cnt;i++)for(j=0;j<=K;j++)for(k=0;k<=K;k++)if(f[i-1][j][k]){
        up(f[i][j][k],f[i-1][j][k]);
        if(a[i].y>0)up(f[i][j+1][k+1],f[i-1][j][k]);
        else if(k)up(f[i][j][k-1],f[i-1][j][k]);
      }
      return printf("%d",f[cnt][K][0]),0;
    }
    

      

  • 相关阅读:
    CCDictionary 用调试器查看问题
    博客 小记
    cocos2d-x 调试问题
    string知识
    静动态库
    fedora 20安装vim Transaction check error
    PyQt中ui编译成窗体.py,中文乱码
    centos编译安装vim7.4
    linux c驴杂记
    c++指针 c指针 改变值
  • 原文地址:https://www.cnblogs.com/clrs97/p/6257334.html
Copyright © 2011-2022 走看看