NYOJ 15 括號匹配(二)
阿新 • • 發佈:2019-02-11
這個是很早之前寫的,今天又從新敲了一遍!
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; }