当前位置: 代码迷 >> 综合 >> POJ 2955 Brackets (区间dp入门)
  详细解决方案

POJ 2955 Brackets (区间dp入门)

热度:48   发布时间:2024-01-04 11:57:59.0

题意:
求一字符串括号序列的最大匹配个数。


思路:
定义dp[i][j]dp[i][j]为从i到j的最大匹配个数,若str[i]和str[j]相匹配,则dp[i][j]=dp[i+1][j?1]+2dp[i][j]=dp[i+1][j?1]+2,枚举k为区间i~j的分段点,状态转移方程为:   dp[s][e]=max(dp[s][e],dp[s][k]+dp[k+1][e]);

代码:


dp[i][j]=max(dp[i][k]dp[k+1][j]

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=106;
char str[maxn];
int dp[maxn][maxn];
int main(){while(~scanf("%s",str)){memset(dp,0,sizeof(dp));if(str[0]=='e')break;int len=strlen(str);for(int l=2;l<=len;l++){for(int s=0;s<len-l+1;s++){int e=s+l-1;if((str[s]=='('&&str[e]==')')||(str[s]=='['&&str[e]==']')){dp[s][e]=dp[s+1][e-1]+2;}for(int k=s;k<e;k++){dp[s][e]=max(dp[s][e],dp[s][k]+dp[k+1][e]);}}}printf("%d\n",dp[0][len-1]);}
}



  相关解决方案