CCF 模拟D 动态规划

http://115.28.138.223:81/view.page?opid=4

这道题写的我醉醉的,想建一棵指定深度的树最后统计满足条件的个数

居然没去考虑这样必然超时!!!代码写的也是醉了,把没完成的代码先贴出来,好好嘲讽下自己

(╬▔皿▔)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int floorer,num,lable;//0 none ; 1 1 ; 3 3 ; 4 1&3
bool shine1,shine0,shine3,shit,shit0;
int x[]={0,2,1,3};
int y[]={2,0,1,3};
int donser1=0,donser2=0,donser3=0,donser4=0,donser5=0;
bool dong1=false,dong2=false,dong3=false,dong4=false,dong5=false;
void creatree(int lab,int flooor)
{

    cout<<"-------->floor:"<<flooor<<"(12)"<<endl;
    if((flooor==floorer+1)&&shine0&&shine1&&shine3){cout<<"*********************************************";num++;}
    if(flooor==floorer+1){cout<<endl<<"&return "<<endl<<endl;return;}
    if(shit&&shit0)
    {
        for(int i=1;i<3;i++)
        {
            cout<<"lab -1 : "<<y[i]<<"(19)"<<endl;
            if(y[i]==0){dong1=shine0;shine0=1;donser1=1;}
            if(y[i]==1){dong1=shine1;shine1=1;lab=1;donser1=2;}
            if(y[i]==3){dong1=shine3;shine3=1;lab=3;donser1=3;}
            if(flooor==floorer+1){cout<<"++++"<<"(23)"<<endl;return;}
            int ii=flooor;
            creatree(lab,++ii);
            if(donser1==1){shine0=dong1;donser1=0;}
            if(donser1==2){shine1=dong1;donser1=0;}
            if(donser1==3){shine3=dong1;donser1=0;}
        }
    }
    if(lab==0)
    {
        for(int i=0;i<4;i++)
        {
            cout<<"lab 0 : "<<x[i]<<"(31)"<<endl;
            if(y[i]==0){dong2=shine0;shine0=1;donser2=1;}
            if(y[i]==1){dong2=shine1;shine1=1;lab=1;donser2=2;}
            if(y[i]==3){dong2=shine3;shine3=1;lab=3;donser2=3;}
            if(flooor==floorer+1){cout<<"????"<<"(35)"<<endl;return;}
            int ii=flooor;
            creatree(lab,++ii);
            if(donser2==1){shine0=dong2;donser2=0;}
            if(donser2==2){shine1=dong2;donser2=0;}
            if(donser2==3){shine3=dong2;donser2=0;}
        }
    }
    if(lab==1)
    {
        for(int i=1;i<4;i++)
        {
            cout<<"lab 1 : "<<x[i]<<"(43)"<<endl;
            if(x[i]==3){dong3=shine3;shine3=1;lab=4;shit=false;donser3=1;}
            if(flooor==floorer+1){cout<<"...."<<"(45)"<<endl;return;}
            int ii=flooor;
            creatree(lab,++ii);
            if(donser3==1){shine3=dong3;donser3=0;}
        }
    }
    if(lab==3)
    {
        for(int i=1;i<4;i++)
        {
            cout<<"lab 3 : "<<y[i]<<"(43)"<<endl;
            if(!y[i]==1&&!shine1){shit=true;}
            if(y[i]==1) {shit=false;dong4=shine1;shine1=1;lab=4;donser4=1;}
            if(flooor==floorer+1){cout<<"````"<<"(56)"<<endl;return;}
            int ii=flooor;
            creatree(lab,++ii);
            if(donser4==1){shine1=dong4;donser4=0;}
        }
    }
    if(lab==4)
    {
        for(int i=2;i<4;i++)
        {
            cout<<"lab 4 : "<<y[i]<<"(64)"<<endl;
            if(flooor==floorer+1){cout<<"----"<<"(65)"<<endl;return;}
            int ii=flooor;
            creatree(lab,++ii);
        }
    }
}
int main()
{
    int n,flooor;
    while(cin>>n)
    {
        floorer=n;
        shine1=shine0=shine3=shit=shit0=false;
        num=lable=0;
        flooor=2;
        creatree(0,flooor);
        cout<<num<<endl;
        cout<<endl<<endl;
        cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++";
        shine1=shine0=shine3=shit=false;
        shit0=true;
        creatree(3,flooor);
        cout<<num<<endl;
        cout<<endl<<endl;
        cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++";
        shine1=shine0=shine3=shit=false;
        shit0=true;
        creatree(0,flooor);
        cout<<num<<endl;
    }
    return 0;
}
View Code
#include<iostream>
using namespace std;
int main()
{
    long long mod=1000000007;
    long long n;
    cin>>n;
    long long**donser=new long long*[n+1];
    for(long long i=0; i<n+1; i++)
        donser[i]=new long long[6];
    for(long long i=0; i<6; i++)
        donser[0][i]=0;
    /*6种状态
    *0--剩013
    *1--剩13
    *2--剩01
    *3--剩3
    *4--剩1
    *5--无
    */
    for(long long i=1; i<=n; i++)
    {
        long long j=i-1;
        donser[i][0]=1;
        donser[i][1]=(donser[j][0]+donser[j][1]*2)%mod;
        donser[i][2]=(donser[j][0]+donser[j][2])%mod;
        donser[i][3]=(donser[j][1]+donser[j][3]*2)%mod;
        donser[i][4]=(donser[j][1]+donser[j][2]+donser[j][4]*2)%mod;
        donser[i][5]=(donser[j][3]+donser[j][4]+donser[j][5]*2)%mod;
    }
    cout<<donser[n][5]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/dzzy/p/5330907.html