Problem p00457 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <cstdio>
#include <vector>
using namespace std;
int num;         // キャラクタの最大数
vector<int> vec; // キャラクタの格納
int ans;         // 出力する答え
//
int Input();  // 入力
void Show();  // 現在のキャラクタの表示
int Delete(); // 同じキャラクタが4つ連なったら消滅させる。消滅できなかったら0を返す
int Combo();  // コンボさせる。戻り値は残ったキャラクタ数
int Calc();   // 最高の手順を探す
//
int main(void) {
  while (Input()) {
    printf("%d\\n", Calc());
  }
  fflush(stdin);
  getchar();
  return 0;
}
//
int Input() {
  vec.clear();
  int ibuf;
  scanf("%d", &num);
  if (num != 0) {
    for (int f1 = 0; f1 < num; f1++) {
      scanf("%d", &ibuf);
      vec.push_back(ibuf);
    }
  } else
    return 0;
  return 1;
}
//
void Show() {
  printf("Show~\\n");
  for (int f1 = 0; f1 < (int)vec.size(); f1++) {
    printf("%d\\n", vec[f1]);
  }
  printf("~Show\\n");
}
//
int Delete() {
  int mem;
  int ret = 0;
  for (int f1 = 0; f1 < (int)vec.size() - 3; f1++) {
    if (vec[f1] == vec[f1 + 1] && vec[f1] == vec[f1 + 2] &&
        vec[f1] == vec[f1 + 3]) {
      ret = 1;
      mem = vec[f1];
      for (int f2 = f1; f2 < (int)vec.size(); f2++) {
        if (mem == vec[f2]) {
          vec.erase(vec.begin() + f2);
          f2--;
        } else {
          break;
        }
      }
    }
  }
  return ret;
}
//
int Combo() {
  vector<int> mem;
  int ret;
  mem = vec;
  while (Delete())
    ;
  ret = vec.size();
  vec = mem;
  return ret;
}
//
int Calc() {
  vector<int> mem = vec;
  int ret = 10001;
  //
  for (int f1 = 1; f1 < (int)vec.size() - 1; f1++) {
    vec = mem;
    if (vec[f1] != vec[f1 - 1]) {
      for (int f2 = 1; f2 <= 3; f2++) {
        vec[f1] = f2;
        int m = Combo();
        ret > m ? ret = m : 0;
      }
    }
  }
  vec = mem;
  //
  return ret;
}

Error: TLE

Fixed submission:

#include <cstdio>
#include <vector>
using namespace std;
int num;         // キャラクタの最大数
vector<int> vec; // キャラクタの格納
int ans;         // 出力する答え
//
int Input();  // 入力
void Show();  // 現在のキャラクタの表示
int Delete(); // 同じキャラクタが4つ連なったら消滅させる。消滅できなかったら0を返す
int Combo();  // コンボさせる。戻り値は残ったキャラクタ数
int Calc();
//
int main(void) {
  while (Input()) {
    printf("%d\\n", Calc());
  }
  fflush(stdin);
  getchar();
  return 0;
}
//
int Input() {
  int ibuf;
  scanf("%d", &num);
  if (num != 0) {
    for (int f1 = 0; f1 < num; f1++) {
      scanf("%d", &ibuf);
      vec.push_back(ibuf);
    }
  } else
    return 0;
  return 1;
}
//
void Show() {
  printf("Show~\\n");
  for (int f1 = 0; f1 < (int)vec.size(); f1++) {
    printf("%d\\n", vec[f1]);
  }
  printf("~Show\\n");
}
//
int Delete() {
  int mem;
  int ret = 0;
  for (int f1 = 0; f1 < (int)vec.size() - 3; f1++) {
    if (vec[f1] == vec[f1 + 1] && vec[f1] == vec[f1 + 2] &&
        vec[f1] == vec[f1 + 3]) {
      ret = 1;
      mem = vec[f1];
      for (int f2 = f1; f2 < (int)vec.size(); f2++) {
        if (mem == vec[f2]) {
          vec.erase(vec.begin() + f2);
          f2--;
        } else {
          break;
        }
      }
    }
  }
  return ret;
}
//
int Combo() {
  vector<int> mem;
  int ret;
  mem = vec;
  while (Delete())
    ;
  ret = vec.size();
  vec = mem;
  return ret;
}
//
int Calc() {
  vector<int> mem = vec;
  int ret = 10001;
  for (int f1 = 0; f1 < (int)vec.size(); f1++) {
    for (int f2 = 1; f2 <= 3; f2++) {
      vec = mem;
      if (vec[f1] != f2) {
        vec[f1] = f2;
        int m = Combo();
        ret > m ? ret = m : 0;
      }
    }
  }
  return ret;
}