您的位置:首页 > 产品设计 > UI/UE

poj 1141 Brackets Sequence

2015-08-01 23:05 316 查看
暂时没有什么思路,最经学习动态规划,还是没有入门。

#include<iostream>
#include<string.h>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
#define MAXSIZE 100
using namespace std;
const int INF = 1<<30;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define MAX 19931117
#define finish -1
#define final -2
#define bracket -3

int dyna[110][110], record[110][110];
char ar[110];

void detre (int i, int j, char *ans)
{
char t1[220], t2[220]; int k;
if (record[i][j] == finish)
{
if (ar[i] == '(' || ar[i] == ')') sprintf(ans, "()");
else sprintf(ans, "[]"); return;
}
else if (record[i][j] == final)
{
sprintf(ans, "%c%c", ar[i], ar[j]);
return;
}
else if (record[i][j] == bracket)
{
detre(i + 1, j - 1, t1);
if (ar[i] == '(') sprintf(ans, "(%s)", t1);
else sprintf(ans, "[%s]", t1);
return;
}
else
{
k = record[i][j];
detre(i, k, t1); detre(k + 1, j, t2);
sprintf(ans, "%s%s", t1, t2);
return;
}
}

int main ()
{
//freopen("data_1141.txt","r",stdin);
int i, j, k, n, t, l; char ans[220];
gets(ar); l = strlen(ar);
if (l == 0) printf("\n");
else
{
for (i = 0; i < l; i++) dyna[i][i] = 1, record[i][i] = finish;
for (n = 1; n < l; n++)
{
for (i = 0; i + n < l; i++)
{
j = i + n;
dyna[i][j] = MAX;
if ((ar[i] == '(' && ar[j] == ')') || (ar[i] == '[' && ar[j] == ']'))
{
if (n == 1) dyna[i][j] = 0, record[i][j] = final;
else
{
dyna[i][j] = dyna[i + 1][j - 1];
record[i][j] = bracket;
}
}
t = record[i][j];
for (k = i; k < j; k++)
{
if (dyna[i][k] + dyna[k + 1][j] < dyna[i][j])
{
dyna[i][j] = dyna[i][k] + dyna[k + 1][j];
t = k;
}
}
record[i][j] = t;
}
}
detre(0, l - 1, ans);
printf("%s\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: