zoukankan      html  css  js  c++  java
  • 1276. Train 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1276

    用 ans[numaa][numab][numba][numbb][0] 表示用 numaa个AA  numab个AB  numba个BA  numbb个BB   以 A为结尾的种类数量

    用 ans[numaa][numab][numba][numbb][1] 表示用 numaa个AA  numab个AB  numba个BA  numbb个BB   以 B为结尾的种类数量

    然后根据结尾是A还是B 进行向后更新数量

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    #include<set>
    #include<map>
    #include<string>
    #include<queue>
    #include<stack>
    #include <iomanip>
    using namespace std;
    #define LL long long
    const int INF=0x3f3f3f3f;
    const int N=45;
    LL ans[20005][2];
    int aa,ab,ba,bb;
    int F(int i,int j,int l,int r)
    {
        int x=r;
        x+=(l*bb);
        x+=(j*ba*bb);
        x+=(i*ab*ba*bb);
        return x;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n,k;
        while(cin>>n>>k)
        {
            ab=0;aa=0;ba=0;bb=0;
            string stmp;
            int locomotive;
            cin>>stmp;
            if(stmp=="AA") locomotive=0;
            if(stmp=="AB") locomotive=1;
            if(stmp=="BA") locomotive=2;
            if(stmp=="BB") locomotive=3;
            for(int i=1;i<=n;++i)
            {
                cin>>stmp;
                if(stmp=="AA") ++aa;
                if(stmp=="AB") ++ab;
                if(stmp=="BA") ++ba;
                if(stmp=="BB") ++bb;
            }
            ++aa;++ab;++ba;++bb;
            memset(ans,0,sizeof(ans));
            if(locomotive==0||locomotive==2)
            ans[0][0]=1;
            else
            ans[0][1]=1;
            LL sum=0;
            for(int i=0;i<aa;++i)
            for(int j=0;j<ab;++j)
            for(int l=0;l<ba;++l)
            for(int r=0;r<bb;++r)
            if(i+j+l+r<=k)
            {
                int x=F(i,j,l,r);
                if(i+j+l+r==k)
                {
                    if(locomotive==0||locomotive==1)
                    sum+=ans[x][0];
                    else
                    sum+=ans[x][1];
                }
                if(ans[x][0]!=0)
                {
                    if(i+1<aa)
                    ans[F(i+1,j,l,r)][0]+=ans[x][0];
                    if(j+1<ab)
                    ans[F(i,j+1,l,r)][1]+=ans[x][0];
                }
                if(ans[x][1]!=0)
                {
                    if(l+1<ba)
                    ans[F(i,j,l+1,r)][0]+=ans[x][1];
                    if(r+1<bb)
                    ans[F(i,j,l,r+1)][1]+=ans[x][1];
                }
            }
            if(sum==0)
            cout<<"NO"<<endl;
            else
            {cout<<"YES"<<endl;cout<<sum<<endl;}
        }
        return 0;
    }
    

      

  • 相关阅读:
    -webkit-margin-before 及 扩展浏览器前缀、内核
    vue封装分页组件
    vue项目中使用qrcode生成二维码
    git中全局设置用户名、邮箱
    promise.all 解说
    超详细弹性盒子布局
    js对象转数组
    js取整数、取余数的方法
    数组方法大全
    Vue绑定class
  • 原文地址:https://www.cnblogs.com/liulangye/p/2935374.html
Copyright © 2011-2022 走看看