您的位置:首页 > 其它

poj1068 Parencodings

2017-04-19 17:37 162 查看
原题链接:Parencodings

题意:

    S        (((()()())))

    P-sequence        4 5 6666    从左到右每个右括号之前左括号的个数

    W-sequence        1 1 1456    从左到右每个右括号和与之配对的左括号内有多少对括号(包括其本身)

#include <cstdio>
const int MAX_N = 20;
int p[MAX_N], w[MAX_N], p1[MAX_N]; //p1[i]表示第i个右括号 左边 相邻左括号的个数
int main(){
int T, n, i, j;
scanf("%d", &T);
while(T --){
scanf("%d", &n);
for(i = 0;i < n;i ++){
scanf("%d", &p[i]);
p1[i] = i > 0 ? p[i] - p[i - 1] : p[i]; //转换为第i个右括号
}
for(i = 0;i < n;i ++){
for(j = i, w[i] = 1; !p1[j --] ;w[i] ++); //w[i]加上左边相邻右括号的个数+1
p1[j + 1] --;
}
for(i = 0;i < n;i ++)
printf("%d%c", w[i], i == n - 1 ? '\n' : ' ');
}
return 0;
}
#include <stdio.h>
#include <string.h>
int p[22], w[22];
int bra[50];	//保存括号0:左括号 1:右括号
int main(){
int T, n;
scanf("%d", &T);
while(T --){
memset(bra, 0, sizeof(bra));
int i, j;
scanf("%d", &n);
int t = 0;
for(i = 0;i < n;i ++){
scanf("%d", &p[i]);
if(i > 0)
t += p[i] - p[i - 1] + 1;
else
t = p[0];
bra[t] = 1;	//此处为右括号
}
//		for(i = 0;i < 2 * n;i ++)
//			printf("%d%c", bra[i], i == 2 * n - 1 ? '\n' : ' ');
int dex = 0;
for(i = 0;i < 2 * n;i ++){
if(bra[i] == 1){	//遇到右括号时
int cnt = 1, vis = 0;
for(j = i - 1;j >= 0;j --){
if(bra[j] == 0){	//右括号左边是左括号
if(vis == 0){
w[dex ++] = cnt;
break;
}
vis --;	//遇到左括号与右括号配对,数量减一
}else{	//左边是右括号,数量加1
cnt ++;
vis ++;	//记录左边右括号的个数
}
}
}
}
for(i = 0;i < n;i ++){
printf("%d%c", w[i], i == n - 1 ? '\n' : ' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: