poj 1068 括号匹配

来源:互联网 发布:e4a磁力解析源码 编辑:程序博客网 时间:2024/06/03 06:41

题意: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]);    }        }


原创粉丝点击