Problem p00145 (C++) — buggy submission, verdict: Memory Limit Exceeded


#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <memory>
#include <string>

#include <algorithm>
#include <bitset>
#include <complex>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>

using namespace std;

#ifdef _MSC_VER
#define __typeof__ decltype
#define strtok_r strtok_s
#endif

#define ITER(c) __typeof__((c).begin())
#define FOREACH(it, c) for (ITER(c) it = (c).begin(); it != (c).end(); ++it)
#define RITER(c) __typeof__((c).rbegin())
#define RFOREACH(it, c) for (RITER(c) it = (c).rbegin(); it != (c).rend(); ++it)
#define REP(i, n) REPEAT(i, 0, n)
#define RREP(i, n) RREPEAT(i, 0, n)
#define REPEAT(i, k, n) for (int i = (k); i < (k + n); ++i)
#define RREPEAT(i, k, n) for (int i = (k) + (n)-1; i >= (k); --i)
#define FROMTO(i, f, t) for (int i = f; i < t; i++)
#define ALL(c) (c).begin(), (c).end()
#define LLPOW(p1, p2) ((ll)pow((double)(p1), (int)p2))
#define ESIZEOF(A) (sizeof(A) / sizeof((A)[0]))
#define CIN_NO_SYNC                                                            \\
  do {                                                                         \\
    cin.tie(0);                                                                \\
    ios_base::sync_with_stdio(false);                                          \\
  } while (0)
#define GETSTR(p) fgets((p), sizeof(p), stdin)
#define CHOMP(p)                                                               \\
  do {                                                                         \\
    char *_q = (p) + strlen(p) - 1;                                            \\
    if (*_q == '\\n' || *_q == '\\r')                                            \\
      *_q = 0;                                                                 \\
  } while (0)
#define FILL(m, v) memset(m, v, sizeof(m))
#define mp make_pair
#define pb push_back
template <class _T> _T MAX(_T p1, _T p2) { return (p1 > p2) ? p1 : p2; }
template <class _T> _T MIN(_T p1, _T p2) { return (p1 < p2) ? p1 : p2; }
template <class _Tv> inline string join(const _Tv &v, string sep = " ") {
  ostringstream s;
  FOREACH(it, v) {
    if (it != v.begin())
      s << sep;
    s << *it;
  };
  return s.str();
}

typedef long long ll;
typedef unsigned long long ull;
typedef double D;
typedef complex<D> P;
#define X real()
#define Y imag()
#define EPS (1e-9)
#define DEQ(p1, p2) (abs((p1) - (p2)) < EPS)

#ifdef _DEBUG
template <class _Tv>
inline void _prfe(const char *_n, const _Tv _c, bool _p = false) {
  ITER(_c) _it = _c.begin();
  if (_p) {
    cout << _n << " = [" << endl;
    for (; _it != _c.end(); ++_it)
      cout << "    " << *_it << endl;
    cout << "]" << endl;
  } else {
    cout << _n << " = [ " << *_it++;
    for (; _it != _c.end(); ++_it)
      cout << ", " << *_it;
    cout << " ]" << endl;
  }
}
#define pf printf
#define pr(n)                                                                  \\
  do {                                                                         \\
    cout << #n " = " << (n) << endl;                                           \\
  } while (0)
#define prfe(n) _prfe(#n, n)
#define prfep(n) _prfe(#n, n, true)
#define dbgchk(n)                                                              \\
  do {                                                                         \\
    if (n)                                                                     \\
      throw;                                                                   \\
  } while (0)
#else
#define pf(...)     /* */
#define pr(...)     /* */
#define prfe(...)   /* */
#define prfep(...)  /* */
#define dbgchk(...) /* */
#endif

int dp[101][101];
const int inf = 1 << 29;

int solve(vector<pair<int, int>> &v) {
  int n = v.size();
  REP(i, n) {
    REP(j, n) dp[i][j] = inf;
    dp[i][i] = 0;
  }
  RREP(l, n) {
    FROMTO(u, l + 1, n) {
      FROMTO(k, l, u) {
        dp[l][u] = MIN(dp[l][u], dp[l][k] +
                                     v[l].first * v[k].second * v[k + 1].first *
                                         v[u].second +
                                     dp[k + 1][u]);
        pf("dp[%d][%d] = dp[%d][%d] + ... + dp[%d][%d]\\n", l, u, l, k, k + 1,
           u);
      }
    }
  }
  return dp[0][n - 1];
}

int main() {
  int n;
  cin >> n;
  vector<pair<int, int>> v;
  REP(i, n) {
    int a, b;
    cin >> a >> b;
    v.pb(mp(a, b));
  }
  cout << solve(v) << endl;
  return 0;
}

Error: MLE

Fixed submission:


#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <memory>
#include <string>

#include <algorithm>
#include <bitset>
#include <complex>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>

using namespace std;

#ifdef _MSC_VER
#define __typeof__ decltype
#define strtok_r strtok_s
#endif

#define ITER(c) __typeof__((c).begin())
#define FOREACH(it, c) for (ITER(c) it = (c).begin(); it != (c).end(); ++it)
#define RITER(c) __typeof__((c).rbegin())
#define RFOREACH(it, c) for (RITER(c) it = (c).rbegin(); it != (c).rend(); ++it)
#define REP(i, n) REPEAT(i, 0, n)
#define RREP(i, n) RREPEAT(i, 0, n)
#define REPEAT(i, k, n) for (int i = (k); i < (k + n); ++i)
#define RREPEAT(i, k, n) for (int i = (k) + (n)-1; i >= (k); --i)
#define FROMTO(i, f, t) for (int i = f; i < t; i++)
#define ALL(c) (c).begin(), (c).end()
#define LLPOW(p1, p2) ((ll)pow((double)(p1), (int)p2))
#define ESIZEOF(A) (sizeof(A) / sizeof((A)[0]))
#define CIN_NO_SYNC                                                            \\
  do {                                                                         \\
    cin.tie(0);                                                                \\
    ios_base::sync_with_stdio(false);                                          \\
  } while (0)
#define GETSTR(p) fgets((p), sizeof(p), stdin)
#define CHOMP(p)                                                               \\
  do {                                                                         \\
    char *_q = (p) + strlen(p) - 1;                                            \\
    if (*_q == '\\n' || *_q == '\\r')                                            \\
      *_q = 0;                                                                 \\
  } while (0)
#define FILL(m, v) memset(m, v, sizeof(m))
#define mp make_pair
#define pb push_back
template <class _T> _T MAX(_T p1, _T p2) { return (p1 > p2) ? p1 : p2; }
template <class _T> _T MIN(_T p1, _T p2) { return (p1 < p2) ? p1 : p2; }
template <class _Tv> inline string join(const _Tv &v, string sep = " ") {
  ostringstream s;
  FOREACH(it, v) {
    if (it != v.begin())
      s << sep;
    s << *it;
  };
  return s.str();
}

typedef long long ll;
typedef unsigned long long ull;
typedef double D;
typedef complex<D> P;
#define X real()
#define Y imag()
#define EPS (1e-9)
#define DEQ(p1, p2) (abs((p1) - (p2)) < EPS)

#ifdef _DEBUG
template <class _Tv>
inline void _prfe(const char *_n, const _Tv _c, bool _p = false) {
  ITER(_c) _it = _c.begin();
  if (_p) {
    cout << _n << " = [" << endl;
    for (; _it != _c.end(); ++_it)
      cout << "    " << *_it << endl;
    cout << "]" << endl;
  } else {
    cout << _n << " = [ " << *_it++;
    for (; _it != _c.end(); ++_it)
      cout << ", " << *_it;
    cout << " ]" << endl;
  }
}
#define pf printf
#define pr(n)                                                                  \\
  do {                                                                         \\
    cout << #n " = " << (n) << endl;                                           \\
  } while (0)
#define prfe(n) _prfe(#n, n)
#define prfep(n) _prfe(#n, n, true)
#define dbgchk(n)                                                              \\
  do {                                                                         \\
    if (n)                                                                     \\
      throw;                                                                   \\
  } while (0)
#else
#define pf(...)     /* */
#define pr(...)     /* */
#define prfe(...)   /* */
#define prfep(...)  /* */
#define dbgchk(...) /* */
#endif

map<vector<pair<int, int>>, int> m;

int solve(vector<pair<int, int>> &v) {
  int n = v.size();
  int min = INT_MAX;
  if (n == 1)
    return 0;
  ITER(m) it = m.find(v);
  if (it != m.end())
    return it->second;
  vector<pair<int, int>> v2(v.begin() + 1, v.end());
  REP(i, n - 1) {
    v2[i].first = v[i].first;
    v2[i].second = v[i + 1].second;
    int cost = v[i].first * v[i].second * v[i + 1].first * v[i + 1].second;
    min = MIN(min, cost + solve(v2));
    v2[i] = v[i];
  }
  m[v] = min;
  return min;
}

int main() {
  int n;
  cin >> n;
  vector<pair<int, int>> v;
  REP(i, n) {
    int a, b;
    cin >> a >> b;
    v.pb(mp(a, b));
  }
  cout << solve(v) << endl;
  return 0;
}