您的位置:首页 > 其它

动态规划 :POJ 1141 括号匹配

2010-07-15 04:10 411 查看
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

char input[101] = {0};
char output[201] = {0};
int d[101][101];
vector<char> ret[101][101];

int INF = 99999999;

int main()
{
int i = 1, j, k, len, MAX_LEN, mmin;
while (i<=100 && scanf("%s", &input[i]))
{
i++;
};

MAX_LEN = strlen((char*)&(input[1]));

for (i=1; i<=MAX_LEN; i++)
{
for (j=i; j<=MAX_LEN; j++)
{
for (k=i; k<=j; k++)
{
ret[i][j].push_back(input[k]);
}
}
}

for (i=1; i<=MAX_LEN; i++)
{
d[i][i] = 1;
switch ((ret[i][i])[0])
{
case '(' :
ret[i][i].push_back(')');
break;
case '[' :
ret[i][i].push_back(']');
break;
case ')' :
ret[i][i].insert(ret[i][i].begin(), '(');
break;
case ']' :
ret[i][i].insert(ret[i][i].begin(), '[');
break;
default :
break;
}
}

for (len=2; len<=MAX_LEN; len++)
{
for (i=1, j=i+len-1; j<=MAX_LEN; i++, j++)
{
mmin = INF;
// (S) or [S]
if ((input[i] == '(' && input[j] == ')') || (input[i] == '[' && input[j] == ']'))
{
if (mmin > d[i+1][j-1])
{
d[i][j] = mmin = d[i+1][j-1];

ret[i][j] = ret[i+1][j-1];
ret[i][j].insert(ret[i][j].begin(), input[i]);
ret[i][j].push_back(input[j]);
}
}

// (S or [S
if (input[i] == '(' || input[i] == '[')
{
if (mmin > d[i+1][j] + 1)
{
d[i][j] = mmin = d[i+1][j] + 1;

ret[i][j] = ret[i+1][j];
ret[i][j].insert(ret[i][j].begin(), input[i]);
if (input[i] == '(')
{
ret[i][j].push_back(')');
}
else
{
ret[i][j].push_back(']');
}
}
}

// )S or ]S
if (input[i] == ')' || input[i] == ']')
{
if (mmin > d[i+1][j] + 1)
{
d[i][j] = mmin = d[i+1][j] + 1;

ret[i][j] = ret[i+1][j];
ret[i][j].insert(ret[i][j].begin(), input[i]);
if (input[i] == ')')
{
ret[i][j].insert(ret[i][j].begin(), '(');
}
else
{
ret[i][j].insert(ret[i][j].begin(), '[');
}
}
}

// S) or S]
if (input[j] == ')' || input[j] == ']')
{
if (mmin > d[i][j-1] + 1)
{
d[i][j] = mmin = d[i][j-1] + 1;

ret[i][j] = ret[i][j-1];
ret[i][j].push_back(input[j]);
if (input[j] == ')')
{
ret[i][j].insert(ret[i][j].begin(), '(');
}
else
{
ret[i][j].insert(ret[i][j].begin(), '[');
}
}
}

// S( or S[
if (input[j] == '(' || input[j] == '[')
{
if (mmin > d[i][j-1] + 1)
{
d[i][j] = mmin = d[i][j-1] + 1;

ret[i][j] = ret[i][j-1];
ret[i][j].push_back(input[j]);
if (input[j] == ')')
{
ret[i][j].push_back(')');
}
else
{
ret[i][j].push_back(']');
}
}
}

for (k=i; k<j; k++)
{
if (mmin > d[i][k] + d[k+1][j])
{
d[i][j] = mmin = d[i][k] + d[k+1][j];
ret[i][j] = ret[i][k];
ret[i][j].insert(ret[i][j].end(), ret[k+1][j].begin(), ret[k+1][j].end());
}
}
}
}

for(i=0; i<ret[1][MAX_LEN].size(); i++)
{
printf("%c", (ret[1][MAX_LEN])[i]);
}

printf("/n");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: