hihoCoder#1110 : 正则表达式(区间DP)

  

#1110 : 正则表达式

1.思路

  区间DP,dp[i][j]代表区间i到j是否为正则表达式.

2.代码

 1 #define debug printf("%s: %d\n", __FUNCTION__, __LINE__);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const int N = 105;
 5 char s[N];
 6 bool dp[N][N];
 7 
 8 int main() {
 9     while(~scanf("%s", s)) {
10         int n = strlen(s);
11         for(int i = 0; i < n; ++ i) {
12             if(s[i] == '0' || s[i] == '1') {
13                  // 对于长度为1的区间,当为1或0时为正则表达式 
14                 dp[i][i] = 1;  
15             }
16             else {
17                 // 不为1或0时为非正则表达式
18                 dp[i][i] = 0;
19             }
20         }
21     // 注意状态转移时运算符为或(|), 以为只要满足题目中的一种情况就可以
22         for(int l = 2; l <= n; ++ l) {
23             for(int i = 0; i+l-1 < n; ++ i) {
24                 int j = i+l-1;
25                 dp[i][j] = 0;                  
26                 if(i<j-1&&s[i]=='('&&s[j]==')') {
27                     dp[i][j] |= dp[i+1][j-1];  
28                     // [i+1,j-1]是正则表达式,则([i+1,j-1])是正则表达式
29                 }
30                 if(s[j]=='*') {               
31                     // P是正则表达式,则P*也是正则表达式
32                     dp[i][j] |= dp[i][j-1];
33                 }
34                 for(int k = i; k < j; ++ k) {
35                     // 当区间[i,k]和区间[k+1,j]为正则表达式时,区间[i,j]当然也是
36                     dp[i][j] |= (dp[i][k]&dp[k+1][j]); 
37                     if(k>i&&s[k]=='|') {
38                         //P和Q都是正则表达式,则P|Q是正则表达式。 
39                         dp[i][j] |= (dp[i][k-1]&dp[k+1][j]); 
40                     } 
41                 }
42             }
43         }
44         if(dp[0][n-1]) { 
45             puts("yes");
46         } 
47         else {
48             puts("no");
49         } 
50     } 
51     return 0;
52 }

 

  

posted @ 2017-09-19 19:37  zq216991  阅读(221)  评论(0编辑  收藏  举报