poj 1068 括号匹配

题意:p序列代表当前右括号的坐标有多少左括号,w序列代表了当前右括号和它匹配的左括号之间有多少个右括号(包括当前右括号)

思路:找到右括号的位置,模拟匹配过程。

#include<iostream>
using namespace std;
int main() {
    int p[30],w[30],s[60];//s是括号序列 0代表"("  1代表")" 
    bool flag[60];
    int T , t;
    scanf("%d",&T);
    while (T --) {
        scanf("%d",&t);
        int left = 1 , j = 1;
        for(int i = 1 ; i <= t ; i ++) {
            scanf("%d",&p[i]);   
            while (left <= p[i]) {
                left ++;
                s[j++] = 0;   
            }
            s[j++] = 1; 
        }
        //for (int i = 1 ; i <= t*2 ; i ++) {
        //    printf("%d ",s[i]);    
        //}
        memset(flag,0,sizeof(flag));
        int sum = 0;
        int g = 0;
        for (int i = 1 ; i <= t*2 ; i ++) {
            if (s[i] == 1) {               //找到一个右括号 
                sum = 0;
                if (!flag[i]) {//并且没有进行匹配的 
                    flag[i] = 1;//标记成已经匹配
                    for (j = i - 1 ; j > 0 ; j --) {//往回找 满足条件与之匹配的左括号 
                        if (flag[j]==0&&s[j]==0) {
                            flag[j] = 1;//标记成已经匹配
                            for (int k = j ; k <= i ; k ++) {//从匹配的左括号 到这个右括号之间,看有多少个已经匹配的右括号(包含这个右括号) 
                                if (flag[k]==1&&s[k]==1) {
                                    sum ++;    
                                }    
                            }
                            w[g++] = sum;
                            break;    
                        }    
                    } 
                }
            }                
        } 
        for (int i = 0 ; i < t - 1 ; i ++) {
            printf("%d ",w[i]);    
        }   
        printf("%d\n",w[t-1]);
    }        
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值