poj1141 Brackets Sequence

黑书上的第一种优化

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
char map[120];
struct T
{
    char str[220];
    int len;//字符串的长度
    int num;//所加字符的数目
}res[120][120];
bool flag[120][120];
void digui(int l,int r)
{
    char temp;
    int i;
    if(l==r)
    {
        if(map[l]=='('||map[l]==')')
        {
            res[l][r].len=2;
            res[l][r].num=1;
            res[l][r].str[0]='(';
            res[l][r].str[1]=')';
            res[l][r].str[2]='\0';
        }
        if(map[r]=='['||map[r]==']')
        {
            res[l][r].len=2;
            res[l][r].num=1;
            res[l][r].str[0]='[';
            res[l][r].str[1]=']';
            res[l][r].str[2]='\0';
        }
        flag[l][r]=true;
        return;
    }
    if((map[l]=='('&&map[r]==')')||(map[l]=='['&&map[r]==']'))
    {
        if(r+1<l-1)
        {
            res[l][r].len=2;
            res[l][r].str[0]=map[l];
            res[l][r].str[1]=map[r];
            res[l][r].num=0;
            res[l][r].str[2]='\0';
        }
        else
        {
            if(flag[l+1][r-1]==false)
            {
                digui(l+1,r-1);
            }
            if(res[l][r].num==-1||res[l][r].num>res[l+1][r-1].num)
            {
                res[l][r].len=0;
                res[l][r].num=res[l+1][r-1].num;
                res[l][r].str[res[l][r].len++]=map[l];
                for(i=0;i<res[l+1][r-1].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l+1][r-1].str[i];
                }
                res[l][r].str[res[l][r].len++]=map[r];
                res[l][r].str[res[l][r].len]='\0';
            }
        }
    }
    else
    {
        if(map[l]=='('||map[l]=='[')
        {
            if(!flag[l+1][r])
            {
                digui(l+1,r);
            }
            if(res[l][r].num==-1||res[l][r].num>res[l+1][r].num+1)
            {
                res[l][r].len=0;
                res[l][r].str[res[l][r].len++]=map[l];
                for(i=0;i<res[l+1][r].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l+1][r].str[i];
                }
                temp=(map[l]=='('?')':']');
                res[l][r].str[res[l][r].len++]=temp;
                res[l][r].str[res[l][r].len]='\0';
            }
        }
        if(map[r]==')'||map[r]==']')
        {
            if(!flag[l][r-1])
            {
                digui(l,r-1);
            }
            if(res[l][r].num==-1||res[l][r].num>res[l][r-1].num+1)
            {
                res[l][r].len=0;
                temp=(map[r]==')'?'(':'[');
                for(i=0;i<res[l][r-1].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l][r-1].str[i];
                }
                res[l][r].str[res[l][r].len++]=temp;
                res[l][r].str[res[l][r].len]='\0';
            }
        }
    }
    for(i=l;i<=r-1;i++)
    {
        if(!flag[l][i])
        {
            digui(l,i);
        }
        if(!flag[i+1][r])
        {
            digui(i+1,r);
        }
        if(res[l][r].num==-1||res[l][r].num>res[l][i].num+res[i+1][r].num)
        {
            res[l][r].num=res[l][i].num+res[i+1][r].num;
            strcpy(res[l][r].str,res[l][i].str);
            strcat(res[l][r].str,res[i+1][r].str);
            res[l][r].len=strlen(res[l][r].str);
        }
    }
    flag[l][r]=true;
}
void init(int l)
{
    int i,j;
    for(i=0;i<l;i++)
    {
        for(j=i;j<l;j++)
        {
            res[i][j].len=0;
            res[i][j].num=-1;
            flag[i][j]=false;
        }
    }
}
int main()
{
    while(gets(map))
    {
        int l=strlen(map);
        init(l);
        if(l==0)
        {
            printf("\n");
            continue;
        }
        digui(0,l-1);
        printf("%s\n",res[0][l-1].str);
    }
    return 0;
}
//1704K 47MS 

黑书上的第二种优化

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
char map[120];
struct T
{
    char str[220];
    int len;//字符串的长度
    int num;//所加字符的数目
}res[120][120];
void digui(int l,int r)
{
    char temp;
    int i;
    if(l==r)
    {
        if(map[l]=='('||map[l]==')')
        {
            res[l][r].len=2;
            res[l][r].num=1;
            res[l][r].str[0]='(';
            res[l][r].str[1]=')';
            res[l][r].str[2]='\0';
        }
        if(map[r]=='['||map[r]==']')
        {
            res[l][r].len=2;
            res[l][r].num=1;
            res[l][r].str[0]='[';
            res[l][r].str[1]=']';
            res[l][r].str[2]='\0';
        }
        return;
    }
    if((map[l]=='('&&map[r]==')')||(map[l]=='['&&map[r]==']'))
    {
        if(r+1<l-1)
        {
            res[l][r].len=2;
            res[l][r].str[0]=map[l];
            res[l][r].str[1]=map[r];
            res[l][r].num=0;
            res[l][r].str[2]='\0';
        }
        else
        {
            if(res[l][r].num==-1||res[l][r].num>res[l+1][r-1].num)
            {
                res[l][r].len=0;
                res[l][r].num=res[l+1][r-1].num;
                res[l][r].str[res[l][r].len++]=map[l];
                for(i=0;i<res[l+1][r-1].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l+1][r-1].str[i];
                }
                res[l][r].str[res[l][r].len++]=map[r];
                res[l][r].str[res[l][r].len]='\0';
            }
        }
    }
    else
    {
        if(map[l]=='('||map[l]=='[')
        {
            if(res[l][r].num==-1||res[l][r].num>res[l+1][r].num+1)
            {
                res[l][r].len=0;
                res[l][r].str[res[l][r].len++]=map[l];
                for(i=0;i<res[l+1][r].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l+1][r].str[i];
                }
                temp=(map[l]=='('?')':']');
                res[l][r].str[res[l][r].len++]=temp;
                res[l][r].str[res[l][r].len]='\0';
            }
        }
        if(map[r]==')'||map[r]==']')
        {
            if(res[l][r].num==-1||res[l][r].num>res[l][r-1].num+1)
            {
                res[l][r].len=0;
                temp=(map[r]==')'?'(':'[');
                for(i=0;i<res[l][r-1].len;i++)
                {
                    res[l][r].str[res[l][r].len++]=res[l][r-1].str[i];
                }
                res[l][r].str[res[l][r].len++]=temp;
                res[l][r].str[res[l][r].len]='\0';
            }
        }
    }
    for(i=l;i<=r-1;i++)
    {
        if(res[l][r].num==-1||res[l][r].num>res[l][i].num+res[i+1][r].num)
        {
            res[l][r].num=res[l][i].num+res[i+1][r].num;
            strcpy(res[l][r].str,res[l][i].str);
            strcat(res[l][r].str,res[i+1][r].str);
            res[l][r].len=strlen(res[l][r].str);
        }
    }
}
void make(int l)
{
    int i,j;
    for(i=0;i<l;i++)
    {
        res[i][i].len=2;
        res[i][i].num=1;
        if(map[i]=='('||map[i]==')')
        {
            res[i][i].str[0]='(';
            res[i][i].str[1]=')';
            res[i][i].str[2]='\0';
        }
        if(map[i]=='['||map[i]==']')
        {
            res[i][i].str[0]='[';
            res[i][i].str[1]=']';
            res[i][i].str[2]='\0';
        }
    }
    for(i=l-2;i>=0;i--)
    {
        for(j=i+1;j<l;j++)
        {
            digui(i,j);
        }
    }
}
void init(int l)
{
    int i,j;
    for(i=0;i<l;i++)
    {
        for(j=i;j<l;j++)
        {
            res[i][j].len=0;
            res[i][j].num=-1;
        }
    }
}
int main()
{
    while(gets(map))
    {
        int l=strlen(map);
        init(l);
        if(l==0)
        {
            printf("\n");
            continue;
        }
        //digui(0,l-1);
        make(l);
        printf("%s\n",res[0][l-1].str);
    }
    return 0;
}
//1688K 79MS 
posted @ 2012-08-01 20:05  willzhang  阅读(245)  评论(0编辑  收藏  举报