Description
Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways: q By an integer sequence P = p1 p2...pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence). q By an integer sequence W = w1 w2...wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence). Following is an example of the above encodings: S (((()()()))) P-sequence 4 5 6666 W-sequence 1 1 1456 Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.Output
The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.Sample Input
2 6 4 5 6 6 6 6 9 4 6 6 6 6 8 9 9 9Sample Output
1 1 1 4 5 6 1 1 2 4 5 1 1 3 9p-代表的是这个右括号前面有几个左括号w-代表的是和这个右括号匹配的左括号在第几位现在已知p矩阵,要求w的值。。做完看到网上好多推出什么公式的。。我是直接用数组模拟的,先将所有的括号形式都存到数组中,然后在从后往前找与之匹配的,算出w的值,不算很好的方法,但是感觉应该好理解些。。 View Code 1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int t,n; 6 int i,j,k; 7 int p[22],w[22],s[100]; 8 scanf("%d",&t); 9 while(t--) 10 { 11 scanf("%d",&n); 12 for(i=0; i<n; i++) 13 scanf("%d",&p[i]); 14 for(i=0; i<p[0]; i++) 15 s[i]=-1; 16 s[i++]=1; 17 for(j=1; j<n; j++) 18 { 19 for(k=0; k<p[j]-p[j-1]; k++) 20 s[i++]=-1; 21 s[i++]=1; 22 } 23 //for(j=0;j<i;j++) 24 //printf("%d",s[j]); 25 i=n-1; 26 for(j=2*n-1; j>=0; j--) 27 { 28 if(s[j]==1) 29 { 30 int sum=0; 31 for(k=j;; k--) 32 { 33 sum+=s[k]; 34 if(sum==0) 35 break; 36 } 37 w[i--]=(j-k+1)/2; 38 } 39 } 40 printf("%d",w[0]); 41 for(j=1; j<n; j++) 42 printf(" %d",w[j]); 43 printf("\n"); 44 } 45 return 0; 46 }
转载于:https://www.cnblogs.com/wilsonjuxta/archive/2013/03/11/2953729.html
相关资源:JAVA上百实例源码以及开源项目