-
描述
-
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的-
输入
-
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行 样例输入
-
4 [] ([])[] ((] ([)]
样例输出
-
0 0 3 2
来源
- 《算法艺术与信息学竞赛》 上传者
-
张云聪
PS:dp[i][j]区间动态规划,,i为区间长度,j为区间开始位置。。。。首先需要初始化,把dp[1][j]=1.再开始遍历,如果第一位和最后一位恰好匹配,就可以查询dp[i-1][j+1]这个区间的过程。如果不匹配,还需要增添一个for循环,使区间分割,再寻找最小值。。
代码如下:
#include<stdio.h> #include<string.h> const int inf=10020; char a[120]; int dp[120][120]; int minn(int a,int b) { return a<b?a:b; } int main() { int t; scanf("%d",&t); while(t--) { memset(dp,inf,sizeof(dp)); int sum=0; scanf("%s",a); int n=strlen(a); for(int i=0;i<n;i++) { dp[1][i]=1; } for(int i=2;i<=n;i++) { for(int j=0;j<=n-i;j++) { dp[i][j]=inf; if(a[j]=='('&&a[j+i-1]==')'||a[j]=='['&&a[j+i-1]==']') { dp[i][j]=minn(dp[i-2][j+1],dp[i][j]); } for(int k=1;k<=i;k++) { dp[i][j]=minn(dp[k][j]+dp[i-k][j+k],dp[i][j]); //printf("!!!%d \n",k); } //printf("%d## %d %d\n",dp[i][j],i,j); } } printf("%d\n",dp[n][0]); } }
-
第一行输入一个正整数N,表示测试数据组数(N<=10)
nyoj 15 括号匹配(二) 区间动规
最新推荐文章于 2022-01-12 22:35:46 发布