区间dp

https://vjudge.net/contest/226480#problem/B

参考博客:https://blog.csdn.net/limhhhhh/article/details/50599551

#include<iostream>
#include<cstring>
using namespace std;
int solve(char a,char b)
{
 if((a=='('&&b==')')||(a=='['&&b==']'))
 return 1;
 else
 return 0;
}
int main()
{
 char s[110];
 while(cin>>s)
 {
  if(s[0]=='e')
  break;
  int len=strlen(s);
  int dp[110][110];
  memset(dp,0,sizeof(dp));
  for(int i=0;i<len;i++)
  {
   if(solve(s[i],s[i+1]))
   dp[i][i+1]=2;
  }
  for(int i=3;i<=len;i++)
  {
   for(int j=0;j+i-1<len;j++)
   {
    if(solve(s[j],s[j+i-1]))
    dp[j][j+i-1]=dp[j+1][j+i-2]+2;
    for(int k=j;k<i+j-1;k++)
    {
     dp[j][j+i-1]=max(dp[j][i+j-1],dp[j][k]+dp[k+1][j+i-1]);
    }
   }
  }
  cout<<dp[0][len-1]<<endl;
 }
 return 0;
}

猜你喜欢

转载自www.cnblogs.com/caijiaming/p/8992261.html