1. 程式人生 > >POJ2955(區間括號匹配)

POJ2955(區間括號匹配)

普通寫法

#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;
}