题目大意:
两种括号匹配,求最长的匹配长度。
思路分析:
状态方程:dp [i][j] 表示区间 i ~ j 之间最长的匹配长度。
转移方程:dp [i][j] = max (dp[i+1][j] , dp[i] [j-1 ] , dp[i+1][k-1] + dp[k+1][j] +2 (条件是i ,k 位置匹配))
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define maxn 105 using namespace std; char str[maxn]; int dp[maxn][maxn]; int main() { while(scanf("%s",str+1)!=EOF) { if(strcmp(str+1,"end")==0)break; int len = strlen(str+1); memset(dp,0,sizeof dp); for(int i=len-1;i>=1;i--) { for(int j=i+1;j<=len;j++) { dp[i][j] = max(dp[i+1][j],dp[i][j-1]); for(int k=i+1;k<=j;k++) { if((str[i]=='(' && str[k]==')') || (str[i]=='[' && str[k]==']')) dp[i][j] = max(dp[i][j],dp[i+1][k-1]+2+dp[k+1][j]); } } } printf("%d\n",dp[1][len]); } return 0; }
POJ 2955 Brackets (区间dp),布布扣,bubuko.com
原文:http://blog.csdn.net/u010709592/article/details/38586431