zoukankan      html  css  js  c++  java
  • POJ

    分析:区间DP的典型题,设dp[i][j]为i到j的最大匹配数

              依次从小到大的区间进行更新

              如果a[i]==a[j]那么产生新的匹配,dp[i][j]=max(dp[i][j],dp[i+1][j-1]+1)

              再依次枚举断点从原先得到的匹配区间中转移,找最大值

              dp[i][j]=max(dp[i][j],dp[i][i+k]+dp[i+k+1][j]);

    代码如下:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    char str[150];
    int dp[150][150];
    int maxx;
    bool check(char x,char y)
    {
      if(x=='('&&y==')')
      return true;
      if(x=='['&&y==']')
      return true;
      return false;
    }
    int main()
    {
        while(scanf("%s",str+1)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            maxx=0;
            int len=strlen(str+1);
            if(str[1]=='e')
            break;
        
            for(int i=1;i<len;i++)
            {
                    if(check(str[i],str[i+1]))
                    {
                      dp[i][i+1]=1;
                    }
            }
            for(int l=2;l<=len-1;l+=1)
            {
                
               for(int i=1;i<=len-l;i++)
               {
                   int j=i+l;
                  if(check(str[i],str[j]))
                  dp[i][j]=max(dp[i][j],dp[i+1][j-1]+1);
                  for(int k=0;i+k<j;k++)
                  dp[i][j]=max(dp[i][j],dp[i][i+k]+dp[i+k+1][j]);
                
                  maxx=max(dp[i][j],maxx);
               }
            }
            printf("%d
    ",maxx*2);
        }
        return 0;
    }
  • 相关阅读:
    NumPy 字符串函数
    NumPy 位运算
    Numpy 数组操作
    最小二乘法的原理与计算
    NumPy 迭代数组
    Making AJAX Applications Crawlable
    mac, start sublime from terminal
    Speed Up Your WordPress Site
    To Support High-Density Retina Displays
    HTML5 tricks for mobile
  • 原文地址:https://www.cnblogs.com/a249189046/p/9639832.html
Copyright © 2011-2022 走看看