• 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;
    }

  • 相关阅读:
    centos 下查找软件安装在哪里的命令
    Ubuntu常用命令大全
    linux下vi命令大全
    查看linux系统版本命令
    Linux系统安装时分区的选择(推荐)
    Java subList的使用
    Java中unicode增补字符(辅助平面)相关用法简介
    Java编码方式再学
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 283. Move Zeroes
  • 原文地址:https://www.cnblogs.com/kiuhghcsc/p/5746399.html
Copyright © 2020-2023  润新知