poj1068 模拟

转载请注明出处:http://blog.csdn.net/awebkit


题目: http://poj.org/problem?id=1068


题意:对于一串符合匹配规则的,仅由左右括号,即()组成的串,长度为2*n。根据该串构造两个数组。P数组,数组有n个数,代表每一个)之前有几个(。W数组,数组有n个数,代表该)之前已匹配了几组(),其中包括自身。现已知一个括号串的P数组,求其W数组。

思路:模拟题。根据P数组的定义,先还原该括号串。然后再通过该括号串对进行W数组进行构造。

第一种解法需要比较深的归纳总结能力,不是我总结的,很厉害

第二种就是上面说的模拟算法

void comp1()
{
    int i,n,t,m;
    int a[43];
    cin>>n;
    while(n--)
    {   
        memset(a,0,sizeof(a));    
        cin>>m;
        for(i=1;i<=m;++i)
        {   
            cin>>t;
            int te=t;
            while(a[t])
            {   
                t-=a[t];
                a[te]+=a[t];
            }   
            a[te]++;
            cout<<a[te]<<" ";
        }   
        cout<<endl;
    }   
}


void comp2()
{
    int seq;
    cin >> seq;
    int n;

    int right, ret, j;
    int msg[50];
    while(seq--)
    {
        cin >> n;
        memset(msg, 0, sizeof(msg));
        int h = 0;
        for (int i = 0; i < n; ++i){
            int k;
            cin >> k;
            k = k + i;
            for (; h < k; ++h){
                msg[h] = '(';
            }
            msg[h] = ')';
            h++;
        }

        for (int i = 0; i < 2*n; ++i){
            if (msg[i] == ')'){
                right = 1;
                ret = 0;
                j = i -1;
                for(;right && j >= 0; j--){
                    if (msg[j] == '('){
                        right--;
                        ret++;

                    } else {
                        right++;
                    }
                }
                cout << ret << " ";
            }
        }
        cout << endl;
    }
}
int main()
{
    //comp1();
    comp2();
    return 0;
}


参考:

http://martinblack954.blog.163.com/blog/static/186105210201142310453870/

http://inowtofuture.blog.163.com/blog/static/1925582162011112935522337/

http://hi.baidu.com/zhuangxie1013/item/f1e8c69f942553d41f4271b4

http://t225com.iteye.com/blog/1355121


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值