POJ 1068 Parencodings 模拟递归
http://poj.org/problem?id=1068
题意:P=每个右括号前面的左括号,W=每个右括号所在的括号包含的完整括号数,包括其本身。已知P,求W。
模拟题,将原括号按照数据呈现出来,用数组记录。
然后用递归求出W,递归的出口为右括号,当为左括号时,对s进行叠加,即所包含的括号数。为右括号时,记录下W,并返回一个s。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int p[100],w[100]; 6 char a[100]; 7 int i,j; 8 int f() 9 { 10 int s=1; 11 while(1) 12 { 13 if(a[j]=='(') 14 { 15 j++; 16 s+=f(); 17 } 18 else 19 { 20 w[i++]=s; 21 j++; 22 return s; 23 } 24 } 25 } 26 main() 27 { 28 int n,N,k,q; 29 scanf("%d",&N); 30 while(N--) 31 { 32 scanf("%d",&n); 33 for(q=0,k=0,i=0;i<n;i++) 34 { 35 scanf("%d",&p[i]); 36 for(j=0;j<p[i]-k;j++) 37 { 38 a[q]='('; 39 q++; 40 } 41 k=p[i]; 42 a[q++]=')'; 43 } 44 i=0;j=0; 45 f(); 46 for(i=0;i<n;i++) 47 { 48 printf("%d ",w[i]); 49 } 50 printf("\n"); 51 } 52 }
第二种:
根据 p 算出 每两个 右括号之间 有多少个 左括号,用 lp数组记录,然后 对每一个 右括号,往前搜索左括号
比如 p 4 5 6 6 6 6 ,那么 lp 值为 4 1 1 0 0 0
从第一个 右括号开始找,第一个对应 lp 第一个,发现lp不为 0 ,即将 lp-1,算出相应前面有多少个 右括号即可,若lp为 0 继续往前扫。。
1 #include<cstdio> 2 #include<cstring> 3 4 #define for if(0);else for 5 6 int p[25]={0}; 7 int lp[25]; 8 9 int main(){ 10 int t; 11 scanf("%d",&t); 12 while(t--){ 13 int n; 14 scanf("%d",&n); 15 for(int i=1;i<=n;i++){ 16 scanf("%d",&p[i]); 17 } 18 for(int i=1;i<=n;i++){ 19 lp[i]=p[i]-p[i-1]; 20 } 21 for(int i=1;i<=n;i++){ 22 int j=i; 23 while(!lp[j]&&j>1){ 24 j--; 25 } 26 lp[j]--; 27 printf("%d%c",i-j+1,i==n?'\n':' '); 28 } 29 } 30 return 0; 31 }