九度OJ 1342:寻找最长合法括号序列II (DP)
- 题目描述:
- 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列。
- 输入:
- 测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过106。
- 输出:
- 对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度。
- 样例输入:
-
(())() (()
- 样例输出:
-
6 2
思路:
这个题比1337题简单多了。
计数左括号数目left,遇到左括号则加,右括号则减(left为0则不需要处理)。
右括号减说明遇到了一对括号匹配,count+=2。
最后count就是所求。
代码:
#include <stdio.h> #define N 1000000 int main(void) { int i; char s[N+1]; int left, count; while (scanf("%s", s) != EOF) { left = count = 0; for(i=0; s[i]; i++) { if (s[i] == '(') left ++; else if (left > 0) { left --; count += 2; } } printf("%d\n", count); } return 0; } /************************************************************** Problem: 1342 User: liangrx06 Language: C Result: Accepted Time:30 ms Memory:1820 kb ****************************************************************/
编程算法爱好者。