大意:给出一串括号组合,p型表示当前位置左边有几个左括号,w型表示与当前括号匹配的左括号右边有几个右括号。给出p求w。
分析:用一个数组c储存当前位置相邻两个右括号有几个左括号,如果相邻右左括号则为1,否则往前匹配,匹配一次对应的c[t]-1,b[i] = b[t]+i-t。
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int a[25]; int b[25]; int c[25]; int main() { int t; scanf("%d", &t); while (t--) { int m, sum = 0; scanf("%d", &m); for (int i = 0; i < m; i++) scanf("%d", &a[i]); c[0] = a[0]; for (int i = 1; i < m ; i++) { c[i] = a[i ] - a[i-1]; } b[0] = 1; c[0]--; for (int i = 1; i < m ; i++) { if(c[i] > 0) { b[i] = 1; c[i]--; } else for (int t = i-1; t >= 0;t--) { if (c[t] > 0) { b[i] = b[t]+i-t; c[t]--; break; } } } for (int i = 0; i < m - 1; i++) printf("%d ", b[i]); printf("%d ", b[m-1]); } return 0; }