NYOJ 15 括号匹配(二)

时间:2021-03-12 18:42:01

题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=15

这个是很早之前写的,今天又从新敲了一遍!

    dp[i][j]表示:从第i个位置到第j个位置至少要添加的括号数目,我们令dp[i][i]表示当前到当前位置至少添加一个括号,假如只有一个括号,那么dp[i][i] = 1;

dp[i][j]:

     如果从第i个位置到第j个位置中间有某个位置k(k >= i && k < j)与第j个位置的括号相匹配,那么

     dp[i][j] = min(dp[i][j], dp[i][k-1]+dp[k+1][j-1]);如果从i到j之间没有与j位置相匹配的括号,也即是:

     dp[i][j] = dp[i][j-1] + 1(即k走到第j-1个位置,未找到匹配!那么括号数就要加1)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN = 110;


bool Is_Match(char a, char b)
{
if((a == '(' && b == ')') || (a == '[' && b == ']'))
return true;
return false;
}

int main()
{
int T, i, j, k, Len;
scanf("%d", &T);
char str[MAXN];
int dp[MAXN][MAXN];
while(T--)
{
memset(dp, 0, sizeof(dp));
scanf("%s", str);
Len = strlen(str);
for(i = 0; i <= Len; ++i)
dp[i][i] = 1;
for(j = 1; j < Len; ++j)
{
for(i = 0; i < j; ++i)
{
dp[i][j] = dp[i][j-1] + 1;
for(k = i; k < j; ++k)
{
if(Is_Match(str[k], str[j]))
dp[i][j] = min(dp[i][j], dp[i][k-1] + dp[k+1][j-1]);
}

}
}
printf("%d\n", dp[0][Len-1]);
}
return 0;
}