Problem p03173 (C++)

Buggy submission (status: Time Limit Exceeded):
//----------------------------templates
#pragma GCC optimize("Ofast")
#pragma GCC target("tune=native")
#pragma GCC target("avx")
//----------------------------
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define int ll

#define FOR(i, j, n) for (int i = (int)(j); i < (n); i++)
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REPS(i, n) for (int i = 1; i <= (int)(n); i++)
#define REPN(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define REPNS(i, n) for (int i = (int)(n); i > 0; i--)

#define I(n) scanf("%lld", &(n))
#define LL(n) scanf("%lld", &(n))
#define pb(n) push_back((n))
#define mp(i, j) make_pair((i), (j))
#define eb(i, j) emplace_back((i), (j))
#define y0 y3487465
#define y1 y8687969
#define j0 j1347829
#define j1 j234892
#define uniq(v) v.erase(unique(v.begin(), v.end()), v.end())

#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())

typedef vector<int> vi;
typedef pair<int, int> pi;
typedef vector<pi> vpi;
typedef vector<vi> vvi;
typedef vector<vpi> vvpi;
typedef vector<vvi> vvvi;

const int mod = 1000000007;

//--------------------------------------------

int n, a[410], rui[410];
int dp[410][410];

int merge(int l, int r) {
  if (r - l <= 1)
    return 0;
  if (r - l == 2)
    return a[l] + a[l + 1];
  int ret = 1LL << 60;
  FOR(mid, l + 1, r) {
    int lsize = rui[mid] - rui[l];
    int rsize = rui[r] - rui[mid];
    int lcost = merge(l, mid);
    int rcost = merge(mid, r);
    ret = min(ret, lsize + rsize + lcost + rcost);
  }
  return dp[l][r] = ret;
}

signed main() {
  I(n);
  REP(i, n) I(a[i]);
  REPS(i, n) rui[i] = rui[i - 1] + a[i - 1];
  cout << merge(0, n) << endl;
}

Fixed submission:
//----------------------------templates
#pragma GCC optimize("Ofast")
#pragma GCC target("tune=native")
#pragma GCC target("avx")
//----------------------------
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define int ll

#define FOR(i, j, n) for (int i = (int)(j); i < (n); i++)
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REPS(i, n) for (int i = 1; i <= (int)(n); i++)
#define REPN(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define REPNS(i, n) for (int i = (int)(n); i > 0; i--)

#define I(n) scanf("%lld", &(n))
#define LL(n) scanf("%lld", &(n))
#define pb(n) push_back((n))
#define mp(i, j) make_pair((i), (j))
#define eb(i, j) emplace_back((i), (j))
#define y0 y3487465
#define y1 y8687969
#define j0 j1347829
#define j1 j234892
#define uniq(v) v.erase(unique(v.begin(), v.end()), v.end())

#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())

typedef vector<int> vi;
typedef pair<int, int> pi;
typedef vector<pi> vpi;
typedef vector<vi> vvi;
typedef vector<vpi> vvpi;
typedef vector<vvi> vvvi;

const int mod = 1000000007;

//--------------------------------------------

int n, a[410], rui[410];
int dp[410][410];

int merge(int l, int r) {
  if (r - l <= 1)
    return 0;
  if (r - l == 2)
    return a[l] + a[l + 1];
  if (dp[l][r])
    return dp[l][r];
  int ret = 1LL << 60;
  FOR(mid, l + 1, r) {
    int lsize = rui[mid] - rui[l];
    int rsize = rui[r] - rui[mid];
    int lcost = merge(l, mid);
    int rcost = merge(mid, r);
    ret = min(ret, lsize + rsize + lcost + rcost);
  }
  return dp[l][r] = ret;
}

signed main() {
  I(n);
  REP(i, n) I(a[i]);
  REPS(i, n) rui[i] = rui[i - 1] + a[i - 1];
  cout << merge(0, n) << endl;
}