题目链接:http://poj.org/problem?id=1068
题目理解了半天,题目大意:给定一个P序列,求W序列,Pi表示第i个右括号前的所有左括号的数量,Wi表示第i个右括号直到与其匹配的左括号之间的左括号的数量(包括与其匹配的左括号),我的解题方法是模拟,先通过P序列求出括号排列方式,再求出W序列,例题解释:
P:456666
第一个右括号之前有4个左括号:(((()
第二个右括号之前有5个左括号,不必从头判断,5-4=1就是第一个右括号和第二个右括号之前的左括号的数量:(((()()
第三个右括号与第二个右括号之间有6-5=1个,(((()()()
第四个右括号与第三个右括号之间有6-6=0个,(((()()())
第五个右括号与第四个右括号之间有6-6=0个,(((()()()))
第六个右括号与第五个右括号之间有6-6=0个,(((()()())))
W:111456
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[400];
char w[200];
char p[200];
int i;
int j;
int k;
int l;
int m;
int n;
int nn;
int t;
int count;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&w[i]);
}
nn=0;
i=0;
l=0;
k=0;
while(nn<n){
for(j=0;j<w[nn]-l;j++){
a[i++]='(';
}
a[i]=')';
for(j=i-1,count=0,m=0;i>=0;j--){
if(a[j]==')'){
m++;
}
else if(a[j]=='('&&m==0){
p[k++]=count+1;
break;
}
else if(a[j]=='('){
m--;
count++;
}
}
i++;
l=w[nn++];
}
/*nn=0;
while(nn<i){
printf("%c ",a[nn++]);
}
printf("\n");*/
for(i=0;i<n;i++){
printf("%d ",p[i]);
}
printf("\n");
}
return 0;
}