POJ 2955 Brackets
Posted i am back
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2955 Brackets相关的知识,希望对你有一定的参考价值。
题意如下:
给一个只包含‘[’,‘]’,‘(’,‘)’的字符串求最大的匹配数,匹配是指一个左括号和一个它右边的右括号匹配,这样一对匹配数是2.
该题是一道区间DP题,思想如下:
在处理区间[ l , r ]的时候,如果s[ l ]与s[ r ]相匹配,那么dp[ l ][ r ]=dp[ l + 1 ][ r - 1 ]+2;
然后再取区间[ l , r ]的每个断点k,dp[ l ][ r ]=max(dp[ l ][ r ],dp[ l ][ k ]+dp[ k + 1 ][ r ])即找中间的最大数。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[150][150]; char s[150]; int main () { while(~scanf("%s", s + 1)) { memset(dp, 0, sizeof(dp)); if(s[1] == ‘e‘) break; int len = strlen(s + 1); for(int l = 1; l <= len; l++) for(int i = 1; i <= len - l + 1; i++) { int j = i + l - 1; 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]); } printf("%d\n", dp[1][len]); } return 0; }
以上是关于POJ 2955 Brackets的主要内容,如果未能解决你的问题,请参考以下文章