题目意思是 p串 代表 第i个右括号左边左括号的个数
w串 代表 第i个右括号匹配后括号内包含的已匹配的括号数加上自身
给你一个p串 求w串
一看到题目就想直接用堆栈 可是感觉那样耗的空间很大,而且好像没必要。。后来想到直接记录下 括号数 第i个右括号 遍历每个右括号,向前遍历找最近的左括号,此位置之后的右括号数就是当前右括号内所包含的括号数
如 P-sequence 4 5 6 6 6 6
改写为 4 1 1 2 1 3 0 4 0 5 0 6
则对1来说,匹配的左括号在p[0]中,所以w[0]=1
p更新为 3 1 1 2 1 3 0 4 0 5 0 6
对第2个右括号 匹配的左括号在p[2]中,所以w[1]=1
p更新为 3 1 0 2 1 3 0 4 0 5 0 6
对第3个右括号,匹配的最括号则在p[4],所以w[2]=1
p: 3 1 0 2 0 3 0 4 0 5 0 6
对第4个右括号,匹配的则在p[0],所以w[3]=4-1+1=4
。。。。。。
#include<stdio.h>
#define N 200
int main()
{
int p[2*N],w[2*N],t,i,n,j,pos,temp,num;
scanf("%d",&t);
while(t--)
{
temp=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&num);
p[i*2]=num-temp;
temp=num;
p[i*2+1]=i+1;
}
for(i=1;i<n*2;i+=2)
{
pos=i-1;
while(!p[pos]&&pos>=0)pos-=2;
w[i/2]=p[i]-p[pos+1]+1;
p[pos]--;
}
for(i=0;i<n;i++)
if(i==0)printf("%d",w[i]);
else
printf(" %d",w[i]);
if(t)printf("\n");
}
return 0;
}