标签:style blog http color strong os
4 [] ([])[] ((] ([)]
0 0 3 2
dp[i][j]表示从区间i到区间j使其所以括号匹配需要补上的最少括号数,那么当出现一个括号时,首先考虑它不与后面匹配的情况,那么需要加一个相对应的括号,让之匹配dp[i][j]=dp[i+1][j]+1;
然后再考虑,若是后面有括号可以让它匹配的情况,那么假设i<k<=j,当s[i]==‘(‘&&s[k]==‘)‘的时候,考虑动态转移,dp[i][j]=dp[i+1][k-1]+dp[k][j]-1
为什么这个动态方程减1呢,因为我将与之匹配的那个括号重新计算了一次,当s[k]==‘)‘的时候,在计算dp[k][k]的时候,我的状态转移已经把这个括号自动匹配了一次,所以要减去这次匹配的........
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 using namespace std; 11 int main() { 12 int dp[110][110],i,j,len,ks,k; 13 char s[110]; 14 scanf("%d",&ks); 15 while(ks--) { 16 scanf("%s",s); 17 len = strlen(s); 18 for(i = 0; i < len; i++) dp[i][i] = 1; 19 for(i = len-2; i >= 0; i--) { 20 for(j = i+1; j < len; j++) { 21 dp[i][j] = dp[i+1][j]+1; 22 for(k = i+1; k <= j; k++) { 23 if(s[i] == ‘(‘ && s[k] == ‘)‘ || s[i] == ‘[‘ && s[k] == ‘]‘) { 24 dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j]-1); 25 } 26 } 27 } 28 } 29 printf("%d\n",dp[0][len-1]); 30 } 31 return 0; 32 }
NYOJ 15 括号匹配(二),布布扣,bubuko.com
标签:style blog http color strong os
原文地址:http://www.cnblogs.com/crackpotisback/p/3845212.html