hihoCoder 1110 正则表达式 (区间dp)

题意:

根据题目要求判断输入的串是否是正则表达式

给定一个字符串,判断其是否为合法的正则表达式。
 一个正则表达式定义为:

 1:0是正则表达式,1也是正则表达式。

 2:P和Q都是正则表达式,则PQ是正则表达式。

 3:P是正则表达式,则(P)是正则表达式

 4:P是正则表达式,则P*也是正则表达式

 5:P和Q都是正则表达式,则P|Q是正则表达式。

题解:

dp[i][j]表示ij区间是否是正则表达式。接着就是根据题目要求dp就好了。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
void cmax(int& a,int b){ if(b>a)a=b; }
void cmin(int& a,int b){ if(b<a)a=b; }
void cmax(ll& a,ll b){ if(b>a)a=b; }
void cmin(ll& a,ll b){ if(b<a)a=b; }
void add(int& a,int b,int mod){ a=(a+b)%mod; }
void add(ll& a,ll b,ll mod){ a=(a+b)%mod; }
const int oo=0x3f3f3f3f;
const ll OO=0x3f3f3f3f3f3f3f3f;
const ll MOD=1000000007;
const int maxn=105;
bool dp[maxn][maxn];
char str[maxn];

int main(){
    //freopen("E:\\read.txt","r",stdin);
    while(scanf("%s",str+1)!=EOF){
        int n=strlen(str+1);
        memset(dp,false,sizeof dp);
        for(int i=1;i<=n;i++){
            if(str[i]=='0'||str[i]=='1')
                dp[i][i]=true;
        }
        for(int L=2;L<=n;L++){
            for(int i=1;i+L-1<=n;i++){
                int j=i+L-1;
                if(dp[i+1][j-1]&&str[i]=='('&&str[j]==')')
                    dp[i][j]=true;
                if(dp[i][j-1]&&str[j]=='*')
                    dp[i][j]=true;
                if(dp[i][j])continue;
                for(int k=i;k<j;k++){
                    if(dp[i][k]&&dp[k+1][j])
                        dp[i][j]=true;
                    if(dp[i][k]&&dp[k+2][j]&&str[k+1]=='|')
                        dp[i][j]=true;
                    if(dp[i][j])break;
                }
            }
        }
        if(dp[1][n]) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}



你可能感兴趣的:(hihoCoder 1110 正则表达式 (区间dp))