Brackets POJ - 2955

解法

区间dp例题,每次枚举分段点的时候先更新如果开始到结束区间端点有闭合的括号,那么dp[start][end]=dp[start+1][end-1]+2其他照常枚举即可

代码

#include <iostream>
#include <cstring>
using namespace std;
int dp[666][666];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string a;
  while(cin>>a)
  {
    if(a[0]=='e')
    break;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=a.size();i++)
    for(int j=0;j<a.size();j++)
    {
      int end=i+j-1;
      if(end>a.size()-1)
      continue;
      if((a[j]=='('&&a[end]==')')||(a[j]=='['&&a[end]==']'))
      dp[j][end]=dp[j+1][end-1]+2;
      for(int k=j;k<end;k++)
      dp[j][end]=max(dp[j][end],dp[j][k]+dp[k+1][end]);
    }
    cout<<dp[0][a.size()-1]<<"\n";
  }
}
posted @ 2019-01-26 21:45  baccano!  阅读(116)  评论(0编辑  收藏