Poj 2955 Brackets (区间dp)
2015-11-02 14:58
363 查看
题目链接:
Poj 2955 Brackets
题目描述:
给出一串括号,问最大合法匹配的括号的数目是多少?
解题思路:
区间DP,dp[x][y]代表区间[x, y)中的最大匹配数目,然后枚举区间长度和起点。考虑一下,对于括号套括号可以由状态[x+1,y-1)转化来,括号连括号可以由[x, k) + [k, y) (x<k<y)转化来。状态转移确定下来以后就可以愉快地打码辣!
Poj 2955 Brackets
题目描述:
给出一串括号,问最大合法匹配的括号的数目是多少?
解题思路:
区间DP,dp[x][y]代表区间[x, y)中的最大匹配数目,然后枚举区间长度和起点。考虑一下,对于括号套括号可以由状态[x+1,y-1)转化来,括号连括号可以由[x, k) + [k, y) (x<k<y)转化来。状态转移确定下来以后就可以愉快地打码辣!
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef __int64 LL; const int maxn = 110; int dp[maxn][maxn]; int main () { char str[maxn]; while (scanf ("%s", str), strcmp(str, "end")) { memset (dp, 0, sizeof(dp)); int len = strlen (str); for (int i=2; i<=len; i++) for (int j=0; j+i<=len; j++) { dp[j][j+i] = dp[j+1][j+i-1]; if (str[j] == '(' && str[j+i-1] == ')') dp[j][j+i] ++; if (str[j] == '[' && str[j+i-1] == ']') dp[j][j+i] ++; for (int k=j+1; k<=j+i; k++) dp[j][j+i] = max (dp[j][j+i], dp[j][k]+dp[k][j+i]); } printf ("%d\n", dp[0][len] * 2); } return 0; }
相关文章推荐
- 67. Add Binary
- UESTC 760 方方是个坏孩子 有限制的最大连续和
- Android Studio教程07-SVN的使用(项目管理与控制)
- 链表--查看链表是否含有环(不一样的方法)
- 用charles抓包乐视app点播协议和是否使用P2P
- 用条件格式提高数据易用性(8)-“数据条”设置 设计要点:可视化、条件格式
- chrome 不允许 textarea 可更改大小
- html5实现弹出提示框,并且伴随遮罩层并且可以关闭弹出框
- SingleNumber
- grep命令的使用
- Cookie同域,跨域单点登录
- python 2.6 替换安装Python2.7
- MAVEN打包可运行jar包
- 用条件格式提高数据易用性(7)-“数据条”基础 设计要点:可视化、条件格式
- 单例模式
- 影像之结构化特征
- MBProgressHUD的基本使用
- 求学随记——珍惜时间≠赶进度
- 电视节目必是可搜索的
- CTP开发——期权操作