제출 #525835

#제출 시각아이디문제언어결과실행 시간메모리
525835DeepessonLinear Garden (IOI08_linear_garden)C++17
65 / 100
68 ms65540 KiB
#include <bits/stdc++.h>

int N,M;
#define MAX 1100000
bool existe[MAX][33][5][2];
int tab[MAX][33][5][2];
int base=2;
std::string s;
int dp(int pos,int pente,int soma,bool desceu){

    int atual = soma;

    for(int i=0;i!=5;++i){

        if(pente&(1<<i)){

            int k = i-2;

            int x = atual-k;

            if(x<-2||x>2){return 0;}

        }

    }

    if(pos==N){

        return 1;

    }

    if(existe[pos][pente][soma+2][desceu])return tab[pos][pente][soma+2][desceu];

    existe[pos][pente][soma+2][desceu]=true;

    if(desceu){

        int alpha=0,beta=0;

        if(atual<2){
            alpha=dp(pos+1,pente|(1<<(soma+3)),soma+1,1);
        }

        if(atual>-2){
            beta=dp(pos+1,pente|(1<<(soma+1)),soma-1,1);
        }

        return tab[pos][pente][soma+2][desceu] = ( alpha + beta ) % M;

    }else {

        if(s[pos]=='L'){

            if(atual>-2){///Aperta L
                return tab[pos][pente][soma+2][desceu] = dp(pos+1,pente|(1<<(soma+1)),soma-1,0);
            }

            else return 0;

        }else {

            int alpha=0,beta=0;

            if(atual<2){///Aperta P
                assert(atual+3<5);
                alpha=dp(pos+1,pente|(1<<(soma+3)),soma+1,0);
            }

            if(atual>-2){///Aperta L
                beta=dp(pos+1,pente|(1<<(soma+1)),soma-1,1);
            }

            return tab[pos][pente][soma+2][desceu] = ( alpha + beta ) % M;

        }
    }
}
int main()
{
    std::cin>>N>>M>>s;
    std::cout<<dp(0,(1<<2),0,0)<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...