Brackets(POJ

来源:互联网 发布:php pack 函数 java 编辑:程序博客网 时间:2024/06/03 20:00

一、题目大意

先定义了什么叫括号,然后问能够匹配的括号数


二、题目思路

dp[i][j]:表示的是区间[i,j]匹配的括号次数。

特殊:当( s[i] == '(' && s[j] == '')' ) || (s[i] == '[' && s[j] == ']') dp[i][j] = dp[i+1][j-1] + 2;


三、附加代码

#include<iostream>#include<cstdio>#include<algorithm>#include<stack>#include<queue>#include<cstring>#include<string>#include<set>#include<cmath>#include<map>#include<sstream>using namespace std;#define inf 0x3f3f3f3ftypedef long long LL;const int maxn = 100 + 8;string s;int dp[maxn][maxn];int main(){    while(cin >>s){        if(s == "end") break;        memset(dp,0,sizeof dp);        int len = (int)s.length();        for(int l = 1; l < len; ++l){ //区间的长度            for(int i = 0, j = l; j < len; ++i, ++j){ //长度为l的区间[i,j]                if( (s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']') ) //特殊条件的判断                    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[0][len-1] << endl;    }    return 0;}/*((()))()()()([]]))[)(([][][)end*/


原创粉丝点击