Brackets
来源:互联网 发布:中国移动app软件下载 编辑:程序博客网 时间:2024/05/21 08:41
思路:用dp[i][j]保存区间i ~ j当前的最大匹配数,找到状态转移方程后更新。长度为1的区间匹配数为0,长度为2的区间如果两者匹配那么匹配数为2,反之为0;在区间i ~ j,如果i和j匹配,那么有一个状态转移方程:dp[i][j] = dp[i+1][j-1] + 2;还有一种转移,在i ~ j之间枚举断点k,转移方程为dp[i][j] = dp[i][k] + dp[k+1][j],在分成两个区间相加的情况和自身之间取较大的作为当前的最大匹配数。不断的更改区间长度,最后便可得到整个区间的最大匹配数。
代码如下:
#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"using namespace std;char s[105];int dp[105][105];bool is_regular(int x,int y) //判断x,y是否匹配{ if(s[x] == '(' && s[y] == ')') { return true; } if(s[x] == '[' && s[y] == ']') { return true; } return false;}int main(){ while(~scanf("%s",s)) { if(s[0] == 'e') { break; } int len = strlen(s); memset(dp,0,sizeof(dp)); for(int i = 0;i < len - 1;i++) { if(is_regular(i,i+1)) //区间长度为2,如果匹配则最大匹配数为2 { dp[i][i+1] = 2; } } for(int k = 3;k <= len;k++) //枚举区间长度 { for(int i = 0;i+k-1 < len;i++) //起点 { if(is_regular(i,i+k-1)) { dp[i][i+k-1] = dp[i+1][i+k-2] + 2; } for(int j = i;j < i+k-1;j++) //断点 { dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j] + dp[j+1][i+k-1]); } } } printf("%d\n",dp[0][len-1]); } return 0;}
0 0
- Brackets
- Brackets
- Brackets
- Brackets
- Brackets
- Brackets
- brackets
- Brackets
- Brackets! Brackets!
- Brackets Sequence
- Adobe Brackets
- Brackets Sequence
- Codility -- Brackets
- [codility]Brackets
- checkio (Brackets)
- poj2955 Brackets
- Brackets sequence
- Brackets Sequence
- 哈理工OJ 2034 Fire Maze【双BFS】【思维】
- 《iOS Human Interface Guidelines》——Sound
- 逆向推演【微信消息列表】交互步骤细节+新手扫盲
- LoadRunner11压力测试时遇到问题及解决办法
- 对于301重定向情况下的模拟登录
- Brackets
- Xutils框架的使用
- Git命令(最常用10组)
- Zoho Books: 小企业如何应对债务
- nurbs
- soupUI导出webservice服务端
- 【Eclipse】--Eclipse之于高效编码,合则生分则死(一)
- Drupal开发时如何使用远端图片减轻工作量
- Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中