Problem p03162 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int rezolvare(int n, vector<int> a, vector<int> b, vector<int> c, int imp,
              int **&memo) {
  int rezultat = 0;
  if (n == -1)
    return 0;
  if (memo[n][imp] != 0)
    return memo[n][imp];
  if (imp == 0) {
    int temp1, temp2, temp3;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp1, max(temp2, temp3));
  } else if (imp == 1) {
    int temp2, temp3;
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp2, temp3);
  } else if (imp == 2) {
    int temp1, temp3;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp1, temp3);
  } else if (imp == 3) {
    int temp1, temp2;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    rezultat = max(temp1, temp2);
  }
  memo[n][imp] = rezultat;
  return rezultat;
}
int main() {
  // ifstream fin("date.in");
  vector<int> a, b, c;
  int n, **memo, valoare;
  cin >> n;
  memo = new int *[n]();
  for (int i = 0; i < n; i++) {
    memo[i] = new int[4]();
    cin >> valoare;
    a.push_back(valoare);
    cin >> valoare;
    b.push_back(valoare);
    cin >> valoare;
    c.push_back(valoare);
  }
  rezolvare(n - 1, a, b, c, 0, memo);
  cout << memo[n - 1][0];
  return 0;
}


Fixed submission:
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int rezolvare(int n, vector<int> &a, vector<int> &b, vector<int> &c, int imp,
              int **&memo) {
  int rezultat = 0;
  if (n == -1)
    return 0;
  if (memo[n][imp] != 0)
    return memo[n][imp];
  if (imp == 0) {
    int temp1, temp2, temp3;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp1, max(temp2, temp3));
  } else if (imp == 1) {
    int temp2, temp3;
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp2, temp3);
  } else if (imp == 2) {
    int temp1, temp3;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp3 = c[n] + rezolvare(n - 1, a, b, c, 3, memo);
    rezultat = max(temp1, temp3);
  } else if (imp == 3) {
    int temp1, temp2;
    temp1 = a[n] + rezolvare(n - 1, a, b, c, 1, memo);
    temp2 = b[n] + rezolvare(n - 1, a, b, c, 2, memo);
    rezultat = max(temp1, temp2);
  }
  memo[n][imp] = rezultat;
  return rezultat;
}
int main() {
  // ifstream fin("date.in");
  vector<int> a, b, c;
  int n, **memo, valoare;
  cin >> n;
  memo = new int *[n]();
  for (int i = 0; i < n; i++) {
    memo[i] = new int[4]();
    cin >> valoare;
    a.push_back(valoare);
    cin >> valoare;
    b.push_back(valoare);
    cin >> valoare;
    c.push_back(valoare);
  }
  rezolvare(n - 1, a, b, c, 0, memo);
  cout << memo[n - 1][0];
  return 0;
}