POJ 2955:Brackets 区间DP基础题

    

Brackets

题目链接:

http://poj.org/problem?id=2955

题意:

给出一个只由'('、')'、'['、']'构成的字符串,字符间可以匹配,左边的 '(' 可以与右边的 ')' 匹配,左边的 '[' 可以与右边的 ']' 匹配

两种匹配不能交叉,可以包含,如 [(])只算2个匹配而[()]算四个匹配,求最大匹配数。

题解:

设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内可以得到的最大匹配数,则有两种情况:

        ① j 不与区间[i,j]内的任意一个字符匹配 dp[i][j]=dp[i][j-1]

        ② 可以在区间[i,j]内找到一个点k使得 k 上的字符可以与 j 上的字符匹配,此时dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2)

代码

#include<stdio.h>
#include<string.h>
const int N=110;
int dp[N][N];
char s[N];
int mmax(int x,int y)
{
  return x>y?x:y;
}
char Get_c(char c)
{
  if(c==')')return '(';
  if(c==']')return '[';
  return '!';
}
void solve()
{
  memset(dp,0,sizeof(dp));
  while(~scanf("%s",s+1)&&s[1]!='e')
  {
    s[0]='?';
    int t=strlen(s)-1;
    for(int len=1;len<t;++len)
    for(int i=1;i+len<=t;++i)
    {
      int j=i+len;
      char c=Get_c(s[j]);
      dp[i][j]=dp[i][j-1];
      for(int k=i;k<j;++k)
      if(s[k]==c)
      {
        dp[i][j]=mmax(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2);
      }
    }
    printf("%d ",dp[1][t]);
  }
}
int main()
{
  solve();
  return 0;
}

原文地址:https://www.cnblogs.com/kiuhghcsc/p/5746399.html