转载请注明出处: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