题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15
4 [] ([])[] ((] ([)]
0 0 3 2
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
#include <cstdio>
#include <cmath>
using namespace std;
char s[110];
int dp[110][110];//dp[i][j]表示从i到j的范围内最少添加的括号
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++)
dp[i][i]=1;
for(int k=1;k<len;k++) //k表示区间间隔,此处是对i 和 j之间的间隔枚举;
{
for(int i=0;i<len-k;i++)
{
dp[i][i+k]=99999999;
if((s[i]=='('&&s[i+k]==')')||(s[i]=='['&&s[i+k]==']'))
{
dp[i][i+k]=dp[i+1][i+k-1];
}
for(int j=i;j<i+k;j++)
if(dp[i][i+k]>dp[i][j]+dp[j+1][i+k])
dp[i][i+k]=dp[i][j]+dp[j+1][i+k];
}
}
cout<<dp[0][len-1]<<endl;
}
return 0;
}
区间dp 括号匹配 nyoj 15,布布扣,bubuko.com
原文地址:http://blog.csdn.net/liusuangeng/article/details/38638057