来源:HDU携程编程大赛第一场。
括号匹配,一个DP经典问题,网上到处都是题解。
用 dp[i][j] 表示从位置 i 到字符位置 j 所需的最少括号数。
#include <iostream> #include <cstring> #include <stack> #include <string> using namespace std; int dp[109][109]; bool islegal(char a,char b) { if(a==‘(‘&&b==‘)‘) return 1; if(a==‘[‘&&b==‘]‘) return 1; if(a==‘[‘&&b==‘]‘) return 1; return 0; } int main() { int testcase; cin>>testcase; while(testcase--) { string tar; cin >> tar; int len=tar.length(); memset(dp, 0, sizeof(dp)); for(int i=0; i<=len;i++) { dp[i][i] = 1; } for(int i=2; i<=len;i++) { for(int j=i-1; j>= 1; j--) { dp[j][i] = dp[j][i - 1] + 1; for(int k = j; k < i; ++k) { if(islegal(tar[k - 1], tar[i - 1])) { dp[j][i] = min(dp[j][i], dp[j][k - 1] + dp[k + 1][i - 1]); } } } } cout << dp[1][len] << endl; } return 0; }
【CodingTrip - 携程编程大赛第一场】1002 括号匹配,布布扣,bubuko.com
【CodingTrip - 携程编程大赛第一场】1002 括号匹配
原文:http://blog.csdn.net/mig_davidli/article/details/23382541