1. 程式人生 > >POJ 1068——Parencodings

POJ 1068——Parencodings

題目連結: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;
}