題意:給一段左右小、中括號串,求出這一串中最多有多少匹配的括號。ios
解法:此問題具備最優子結構,dp[i][j]表示i~j中最多匹配的括號,顯然若是i,j是匹配的,那麼dp[i][j] = dp[i+1][j-1]+2;spa
不然咱們能夠分區間取最值。dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]); k在i,j之間。code
代碼:blog
#include <iostream> #include <cstring> #include <algorithm> #include <string> #include <vector> using namespace std; class Solution { public: int longestValidParentheses(string s) { int n = s.length(); vector<vector<int> > dp(n+1); for(int i=0;i<n;i++) for(int j=0;j<n;j++) dp[i].push_back(0); for(int len=2;len<=n;len++) { for(int i=0,j;i<=n-len;i++) { j=i+len-1; if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')) dp[i][j] = max(dp[i][j],dp[i+1][j-1]+2); for(int k=i;k<j;k++) dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]); } } return dp[0][n-1]; } }; int main() { Solution a; string s; while(cin>>s) { if(s == "end") break; cout<<a.longestValidParentheses(s)<<endl; } return 0; }