zoukankan      html  css  js  c++  java
  • poj 2955 Brackets 区间dp

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

    【题意】 给出一串括号的字符串最长100,    (), [], (()), ()[], ()[()]  是合法的

                想这种 (, ], )(, ([)], ([(] 是不合法的   求出最长的 合法的 子序列

    【思路】 d[i][j]  从i到j 的最长的

                if (d[i][i+k]<d[i][t-1]+d[t+1][i+k-1]+2)

                       (d[i][i+k]<d[i][t-1]+d[t+1][i+k-1]+2

              注意求d[i][j]的顺序   因为大区间依赖小区间所以按j-i 递增的顺序来求

             具体的看代码

        

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #define INF 100000000
    using namespace std;
    
    int d[102][102];
    char s[102];
    int ok(int x,int y)
    {
        if(s[x]==']'&&s[y]=='[')
            return 1;
        if(s[x]==')'&&s[y]=='(')
            return 1;
        return 0;
    }
    int main()
    {
        int i,j,m,t,k;
        while(~scanf("%s",s+1))
        {    
            if(strcmp(s+1,"end")==0)
                break;
            int n=strlen(s+1);
            //printf("s  %s
    ",s); 
            memset(d,0,sizeof(d));
            for(k=1;k<=n;k++)
                for(i=1;i+k<=n;i++)
                {
                    d[i][i+k]=d[i][i+k-1];
                    if(s[i+k]==']'||s[i+k]==')')
                        for(t=i;t<i+k;t++)
                            if(ok(i+k,t)&&d[i][i+k]<d[i][t-1]+d[t+1][i+k-1]+2)
                                d[i][i+k]=d[i][t-1]+d[t+1][i+k-1]+2;
                            //printf("&  %d %d   %d   %c
    ",i,i+k,d[i][i+k],s[i+k]);
                }
                int ans=0;
                for(i=1;i<=n;i++)
                    for(j=i+1;j<=n;j++)
                        if(ans<d[i][j])
                            ans=d[i][j];
            printf("%d
    ",ans);
           
        }
        return 0;
    }
  • 相关阅读:
    静态连接库
    03数据的增删改查
    02MySQL中的数据类型
    01MySQL的 库、表初步认识
    Python 函数
    Linux系统目录结构
    Linux系统启动过程
    第三章 Web页面建设
    《第二章:深入了解超文本》
    《HTML与CSS 第一章 认识HTML》读书笔记
  • 原文地址:https://www.cnblogs.com/assult/p/3451144.html
Copyright © 2011-2022 走看看