1126:Simply Syntax

keyword

構文解析 C

概要

pはvalid。sがvalidなとき、Nsはvalid。s,tがvalidなとき、Cstはvalid。このルールの元で、与えられた文字列がvalidかどうかを判定する問題。
素直に実装する。あと多分メモ化は意味ないはず。

char str[300];
int memo[300][300];
int n;

int preCheck(){
    int i,j;
    for(i=0;i<n;i++){
        if('p'<=str[i]&&str[i]<='z')
            str[i] = 'p';
        else if(str[i]=='C' || str[i]=='D' || str[i]=='E' || str[i]=='I')
            str[i] = 'C';
        else if(str[i]!='N')
            return 0;
    }
    for(i=0;i<=n;i++)
        for(j=0;j<=n;j++)
            memo[i][j] = -1;
    return 1;
}

int isCorrect(int from, int end){
    int i;
    char c=str[from];
    if(from>=end) return 0;
    if(memo[from][end]>=0) return memo[from][end];
    if(c=='p') return memo[from][end] = (end-from==1?1:0);
    else if(c=='N') return memo[from][end] = isCorrect(from+1,end);
    else{
        for(i=from+1;i<end;i++)
            if(isCorrect(from+1,i) && isCorrect(i,end))
                return memo[from][end] = 1;
    }
    return memo[from][end] = 0;
}

int main(){
    while(scanf("%s\n",str)!=EOF){
        n = strlen(str);
        puts((preCheck()&&isCorrect(0,n))?"YES":"NO");
    }
}