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

来源:互联网 发布:数据安全与编程技术 编辑:程序博客网 时间:2024/06/04 19:14

题意:

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

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

 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;}



0 0
原创粉丝点击