poj2955 Brackets (区间dp)

Brackets

Time Limit:1000MSMemory Limit:65536K

Total Submissions:3571Accepted:1847

Description

We give the following inductive definition of a “regular brackets” sequence:

For instance, all of the following character sequences are regular brackets sequences:

(), [], (()), ()[], ()[()]

while the following character sequences are not:

(, ], )(, ([)], ([(]

Given a brackets sequence of charactersa1a2…an, your goal is to find the length of the longest regular brackets sequence that is a subsequence ofs. That is, you wish to find the largestmsuch that for indicesi1,i2, …,imwhere 1 ≤i1<i2< … <im≤n,ai1ai2…aimis a regular brackets sequence.

Given the initial sequence([([]])], the longest regular brackets subsequence is[([])].

Input

The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters(,),[, and]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.

Output

For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.

Sample Input

((()))()()()([]]))[)(([][][)end

Sample Output

66406

Source

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 105char a[N];int dp[N][N];int main(){while(scanf("%s",a)&&a[0]!='e'){ memset(dp,0,sizeof(dp)); int len=strlen(a); for(int i=len-1;i>=0;i–)for(int j=i+1;j<len;j++) {dp[i][j]=dp[i+1][j];for(int k=i+1;k<=j;k++)if(a[i]=='('&&a[k]==')'||a[i]=='['&&a[k]==']')dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2); } printf("%d\n",dp[0][len-1]);}return 0;}

,天不负;卧薪尝胆,三千越甲可吞吴。

poj2955 Brackets (区间dp)

相关文章:

你感兴趣的文章:

标签云: