2014년 8월 10일 일요일

BRACKETS

알고 스팟 BRACKETS
<재귀>
[-] Collapse
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int cache[101][101];
string s;
int search(int l, int r){
 if (l >= r) return cache[l][r] = 0;
 int& ret = cache[l][r];
 if (ret != -1) return ret;
 ret = 0;
 if (s[l] == '(' && s[r] == ')')
  ret = search(l + 1, r - 1) + 2;
 if (s[l] == '[' && s[r] == ']')
  ret = search(l + 1, r - 1) + 2;
 for (int next = l; next < r; next++)
  ret = max(ret, search(l, next) + search(next+1, r));
 return ret;
}
int main(){
 while (cin >> s){
  if (s == "end") break;
  memset(cache, -1, sizeof(cache));
  cout << search(0, s.size() - 1) << endl;
 }
}
-------------------------------------------------------------------------
<for문>

[-] Collapse
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int d[103][103];
int main(){
 string s;
 while (cin >> s){
  if (s == "end") break;
  int n = s.size();
  memset(d, 0, sizeof(d));
  for (int b = 1; b < n; b++) {
   for (int i = 0; i + b < n; i++) {
    int j = i + b;
    d[i][j] = 0;
    if (s[i] == '(' && s[j] == ')')
     d[i][j] = max(d[i][j], d[i + 1][j - 1] + 2);
    if (s[i] == '[' && s[j] == ']')
     d[i][j] = max(d[i][j], d[i + 1][j - 1] + 2);
    for (int k = i; k < j; k++)
     d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j]);
   }
  }
  printf("%d\n", d[0][n - 1]);
 }
 return 0;
}

댓글 없음:

댓글 쓰기