POJ2955(區間括號匹配)
阿新 • • 發佈:2018-12-18
普通寫法
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> using namespace std; typedef long long ll; const int N = 1e2 + 5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; int dp[N][N]; char s[N]; int main() { while(gets(s+1)){ if(s[1] == 'e') break; memset(dp,0,sizeof(dp)); int n = strlen(s+1); for(int len = 2;len <= n;len ++){ for(int i = 1;i <= n - len + 1;i ++){ int 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]); } } } cout << dp[1][n] << endl; } return 0; }