博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2955括号匹配问题(区间DP)
阅读量:5124 次
发布时间:2019-06-13

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

Brackets
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4834   Accepted: 2574

Description

We give the following inductive definition of a “regular brackets” sequence:

  • the empty sequence is a regular brackets sequence,
  • if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and
  • if a and b are regular brackets sequences, then ab is a regular brackets sequence.
  • no other sequence is a regular brackets sequence

For instance, all of the following character sequences are regular brackets sequences:

(), [], (()), ()[], ()[()]

while the following character sequences are not:

(, ], )(, ([)], ([(]

Given a brackets sequence of characters a1a2 … an, your goal is to find the length of the longest regular brackets sequence that is a subsequence of s. That is, you wish to find the largest m such that for indices i1i2, …, im where 1 ≤ i1 < i2 < … < im ≤ nai1ai2 … aim is a regular brackets sequence.

Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].

Input

The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters ()[, and ]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.

Output

For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.

Sample Input

((()))()()()([]]))[)(([][][)end

Sample Output

6         
 
6 4 0 6 Difficulty: (1).状态:dp[i][j]为i~j的最大括号数。             (2). 转移:考虑第i个括号,有两种情况:
1.i无效,直接算dp[i + 1][j];                       2.找到和i匹配的右括号k,分两边算并加起来。dp[i][j] = dp[i+1][k-1] + 2 + dp[k + 1][j] 感想:记忆化搜索实质上就是暴力枚举。
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x3f3f3f3f;const double eps=1e-10;const double PI=acos(-1.0);#define maxn 1100char a[maxn];int dp[maxn][maxn];int is(char b, char c){ if(b == '(' && c == ')' || b == '[' && c == ']') return 1; else return 0;}int dfs(int st, int ed){ // if(st > ed) return 0; if(st == ed) return 0; if(dp[st][ed] != -1) return dp[st][ed]; int res = dfs(st+1, ed); for(int k = st+1; k <= ed; k++) if(is(a[st],a[k])) { res = max(res,dfs(st+1,k-1) + 2 + dfs(k+1,ed)); flag = 1; } dp[st][ed] = res; return dp[st][ed];}int main(){ while(~scanf("%s", a)) { if(strcmp(a, "end") == 0) break; memset(dp, -1, sizeof dp); int ed = strlen(a)-1; printf("%d\n", dfs(0, ed)); } return 0;}

 

 

转载于:https://www.cnblogs.com/ZP-Better/p/5133600.html

你可能感兴趣的文章
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>