NYOJ 括號匹配(二)(區間dp)
阿新 • • 發佈:2019-02-13
描述
給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
輸入
第一行輸入一個正整數N,表示測試資料組數(N<=10)
每組測試資料都只有一行,是一個字串S,S中只包含以上所說的四種字元,S的長度不超過100
輸出
對於每組測試資料都輸出一個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行
樣例輸入
4
[]
([])[]
((]
([)]
樣例輸出
0
0
3
2
給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
輸入
第一行輸入一個正整數N,表示測試資料組數(N<=10)
每組測試資料都只有一行,是一個字串S,S中只包含以上所說的四種字元,S的長度不超過100
輸出
對於每組測試資料都輸出一個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行
樣例輸入
4
[]
([])[]
((]
([)]
樣例輸出
0
0
3
2
一個區間配對可以分成兩種情況
(1)從中間截下去,左右個兩部分各自進行配對
(2)首位配對,中間剩下的配對
一個區間對應的值就是這兩個部分的和
AC程式碼:
# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; const int inf = 2000000000; int dp[110][110]; char s[110]; bool judge(char a, char b){ if(a=='('&&b==')'||a=='['&&b==']'){ return true; } return false; } int main(){ int i, j, k, n, t, length; scanf("%d", &t); while (t--){ scanf("%s", s); length=strlen(s); for(i=0; i<length; i++){ dp[i][i]=1; } for(i=0; i<length-1; i++){ if(judge(s[i], s[i+1])==true){ dp[i][i+1]=0; } else{ dp[i][i+1]=2; } } for(i=3; i<=length; i++){ for(j=0; j<=length-1-i+1; j++){ dp[j][j+i-1]=inf; if(judge(s[j], s[j+i-1])){ dp[j][j+i-1]=min(dp[j+1][j+i-2], dp[j][j+i-1]); } for(k=j; k<=j+i-2; k++){ dp[j][j+i-1]=min(dp[j][j+i-1], dp[j][k]+dp[k+1][j+i-1]); } } } printf("%d\n", dp[0][length-1]); } return 0; }