nyoj 括号匹配(二) 15 (区间dp) 好题
2015-10-02 10:40
260 查看
括号匹配(二)
时间限制:1000 ms | 内存限制:65535 KB难度:6
描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100输出对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行样例输入
4 [] ([])[] ((] ([)]
样例输出
0 0 3 2
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MIN(a,b) (a>b?b:a) int dp[1100][1100]; char a[1100]; int main() { int t,i,j,k,l,ii; scanf("%d",&t); getchar(); while(t--) { scanf("%s",a); l=strlen(a); for(i=0;i<l;i++) { for(j=0;j<l;j++) { if(i<j) dp[i][j]=110; else if(i==j) dp[i][i]=1; else dp[i][j]=0; } } for(ii=1;ii<l;ii++)//表示区间,从一一直到l,全部遍历 { for(i=0;i<l-1;i++) { j=ii+i; if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']')) dp[i][j]=MIN(dp[i][j],dp[i+1][j-1]); for(k=i;k<j;k++) dp[i][j]=MIN(dp[i][j],dp[i][k]+dp[k+1][j]); } } printf("%d\n",dp[0][l-1]); } return 0; }
相关文章推荐
- 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH
- 由微信推送引发的SQL join语句总结,顺便复习一下下MySQL
- Jpype的使用
- **Palindrome Partitioning
- 黑马程序员-----设计模式
- 研究生第一个月学习y我喜欢看博客总结
- mysql 连接数据库实例java代码
- Tomcat 多实例
- 查询比105号员工工资高的员工的员工号,员工名,员工工资信息
- 数组
- Valid Anagram -- leetcode
- POJ2773(容斥+二分)
- Git 解决冲突
- node起步
- spring源码
- POJ 3076 Sudoku (DLX解数独)
- openssl
- 返回刚插入的数据的主键
- free 与 delete 区别
- 了解CMS(Concurrent Mark-Sweep)垃圾回收器