动态规划 :POJ 1141 括号匹配

#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; }

你可能感兴趣的:(动态规划 :POJ 1141 括号匹配)