博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2955 区间DP Brackets
阅读量:5209 次
发布时间:2019-06-14

本文共 1346 字,大约阅读时间需要 4 分钟。

求一个括号的最大匹配数,这个题可以和比较着看。

注意题目背景一样,但是所求不一样。

回到这道题上来,设d(i, j)表示子序列Si ~ Sj的字符串中最大匹配数,如果Si 与 Sj能配对,d(i, j) = d(i+1, j-1)

然后要枚举中间点k,d(i, j) = max{ d(i, k) + d(k+1, j) }

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 const int maxn = 100 + 10; 8 9 int n;10 char s[maxn];11 int d[maxn][maxn];12 13 bool inline match(char c1, char c2)14 {15 if(c1 == '[' && c2 == ']') return true;16 if(c1 == '(' && c2 == ')') return true;17 return false;18 }19 20 int main()21 {22 while(scanf("%s", s) == 1 && s[0] != 'e')23 {24 n = strlen(s);25 for(int i = 0; i + 1 < n; i++)26 {27 if(match(s[i], s[i+1])) d[i][i+1] = 2;28 else d[i][i+1] = 0;29 }30 31 for(int l = 3; l <= n; l++)32 {33 for(int i = 0; i + l - 1 < n; i++)34 {35 int j = i + l - 1;36 d[i][j] = 0;37 if(match(s[i], s[j])) d[i][j] = d[i+1][j-1] + 2;38 for(int k = i; k < j; k++)39 d[i][j] = max(d[i][j], d[i][k] + d[k+1][j]);40 }41 }42 43 printf("%d\n", d[0][n-1]);44 }45 46 return 0;47 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4695801.html

你可能感兴趣的文章
ETL
查看>>
Tomcat源码分析(六)--日志记录器和国际化
查看>>
今天把csdn的博客搬家到博客园
查看>>
D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线......
查看>>
基于网络的 Red Hat 无人值守安装
查看>>
Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】...
查看>>
MySQL学习笔记(二):MySQL数据类型汇总及选择参考
查看>>
jQ 移动端返回顶部代码整理
查看>>
博客园界面美化
查看>>
sql查询远程数据库的表的数据并填充到本地数据库的表
查看>>
YII缓存依赖的应用
查看>>
决策树在机器学习的理论学习与实践
查看>>
Biee 11g权限详解
查看>>
minggw 安装
查看>>
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
[BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
查看>>
PHP基础入门(二)
查看>>
[Luogu P3119] [USACO15JAN]草鉴定Grass Cownoisseur (缩点+图上DP)
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
18款在线代码片段测试工具
查看>>