hihoCoder 1110 正则表达式 (区间dp)
发布时间:2020-12-13 22:31:54 所属栏目:百科 来源:网络整理
导读:题意: 根据题目要求判断输入的串是否是正则表达式 给定一个字符串,判断其是否为合法的正则表达式。 一个正则表达式定义为: 1:0是正则表达式,1也是正则表达式。 2:P和Q都是正则表达式,则PQ是正则表达式。 3:P是正则表达式,则(P)是正则表达式 4:P是
题意: 根据题目要求判断输入的串是否是正则表达式 给定一个字符串,判断其是否为合法的正则表达式。 题解: 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("yesn"); else printf("non"); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |