hihocoder 1110 正则表达式
2015-08-21 19:04
260 查看
题目点我
动态规划,按照题目中正则表达式的递归定义递归地判断,并记录子问题的解。
dp[l][r]dp[l][r]记录从ll到rr这一段是不是正则表达式。
加一个自底向上求解的代码
动态规划,按照题目中正则表达式的递归定义递归地判断,并记录子问题的解。
dp[l][r]dp[l][r]记录从ll到rr这一段是不是正则表达式。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 105 int dp[maxn][maxn]; char s[maxn]; int check(int l, int r){ if(dp[l][r] != -1){ return dp[l][r]; } if((s[l] == ')') || (s[l] == '*') || (s[l] == '|')){ return dp[l][r] = 0; } if(l == r){ if((s[l] == '1') || (s[l] == '0')){ return dp[l][l] = 1; } return dp[l][l] = 0; } if((s[l] == '(') && (s[r] == ')')){ if((check(l + 1, r - 1) == 1) && (r - l > 1)){ return dp[l][r] = 1; } //return dp[l][r] = 0; 在这里提前返回会WA,没想明白为啥 } if(s[r] == '*'){ return dp[l][r] = check(l, r - 1); } for(int i = l; i < r; i++){ if(s[i] == '|'){ if((check(l, i - 1) == 1) && (check(i + 1, r) == 1)){ return dp[l][r] = 1; } } if((check(l, i) == 1) && (check(i + 1, r) == 1)){ return dp[l][r] = 1; } } return dp[l][r] = 0; } int main(){ int len; while(scanf("%s", s) != EOF){ memset(dp, -1, sizeof(dp)); len = strlen(s); if(check(0, len - 1) == 1){ printf("yes\n"); }else{ printf("no\n"); } } return 0; }
加一个自底向上求解的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 105 char s[maxn]; bool dp[maxn][maxn]; int main(){ int i, j, k, m, len; while(scanf("%s", s) != EOF){ memset(dp, false, sizeof(dp)); len = strlen(s); for(i = 0; i < len; i++){ if((s[i] == '1') || (s[i] == '0')){ dp[i][i] = true; } } for(k = 0; k < len; k++){ for(i = 0; i + k < len; i++){ j = i + k; for(m = i; m <= j; m++){ if((m > i) && (s[m] == '|')){ dp[i][j] |= dp[i][m - 1] & dp[m + 1][j]; } dp[i][j] |= dp[i][m] & dp[m + 1][j]; } if((s[i] == '(') && (s[j] == ')')){ dp[i][j] |= dp[i + 1][j - 1]; } if(s[j] == '*'){ dp[i][j] |= dp[i][j - 1]; } } } if(dp[0][len - 1]){ printf("yes\n"); }else{ printf("no\n"); } } return 0; }
相关文章推荐
- STM32的PWM输入模式设置并用DMA接收数据
- WebService只能在本地使用,无法通过网络访问的解决办法
- Oracle 学习之卸载Oracle 11g
- main函数的参数(一)
- iOS 屏幕适配
- 04---XML编程整理
- Linux命令(7)
- PAT 1007 A除以B (大数相除)
- js的表达式,运算符,与优先级
- linux定时任务的设置
- FaxConInit
- hdu 5412 CRB and Queries(树套树模板,区间第K大)
- 大型网站架构技术一览
- Codeforces Gym 100338C C - Important Roads tarjan
- C# .net 抓取网页内容
- instanceof关键字详解
- hihoCoder 1079 离散化(线段树离散化)
- 多线程的简单应用
- Android中实现垂直滑动中水平滑动毫无障碍
- syslinux 制作多系统启动U盘