/*
* poj 1068 Parencodings
题目大意:
对于成对出现的括号序列有两种编码方式,P编码和W编码。如下例:
S (((()()()))) -- 括号序列
P-sequence 4 5 6666 -- P编码,出现在该右括号前的左括号个数
W-sequence 1 1 1456 -- W编码,与该右括号匹配的左括号的序数
解题思路:
1、f(i)表示第i个右括号与第i-1个右括号之间的左括号的个数
2、对于第i个右括号从其开始向前搜索第一个不为0的f(k),
经过的元素个数即左括号的序数,同时将f(k)值减1
*/
#include <iostream>
#include <cstdio>
namespace {
using namespace std;
const int N_MAX = 100;
int f[N_MAX+1]; // f值得存储,空间复杂度
int P[N_MAX+1]; // 存储读入的P值,其实这个都可以省掉的
}
int main()
{
int T;
scanf("%d", &T);
for (int t=0; t<T; t++)
{
int n;
scanf("%d", &n);
for (int i=1; i<=n; i++)
{
scanf("%d", &P[i]);
f[i] = P[i]-P[i-1]; // 计算f(i)
}
for (int i=1; i<=n; i++)
{
int k = 0;
for (int j=i; j>0; j--) // 向前搜素第一个非0的f值
{
k++; // 计数累加
if (f[j]>0)
{
f[j]--; // 更新f值
break;
}
}
printf("%d ", k);
}
printf("\n");
}
return 0;
}
poj 1068 Parencodings
最新推荐文章于 2022-10-09 16:11:21 发布