zoj 1016 Parencodings

47 篇文章 0 订阅

题目意思是 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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值