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

#include <algorithm>
#include <array>
#include <climits>
#include <cmath>
#include <cstdio>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
const int MOD = 1000000007;
const int INF = 1000000000;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const double eps = 1e-9;
const int inf = 1e9;
typedef pair<int, int> P;
struct Point {
  double x, y;
  Point() {
    x = 0;
    y = 0;
  }
  Point(double d_x, double d_y) { x = d_x, y = d_y; }
  double operator*(Point obj) { return obj.x * x + obj.y * y; }
  double operator%(Point obj) { return obj.y * x - obj.x * y; }
  Point operator*(double b) {
    Point tmp;
    tmp.x = x * b;
    tmp.y = y * b;
    return tmp;
  }
  Point operator/(double b) {
    Point tmp;
    tmp.x = x / b;
    tmp.y = y / b;
    return tmp;
  }
  Point operator+(Point obj) {
    Point tmp;
    tmp.x = x + obj.x;
    tmp.y = y + obj.y;
    return tmp;
  }
  Point operator-() {
    Point tmp;
    tmp.x = -x;
    tmp.y = -y;
    return tmp;
  }
  Point operator-(Point obj) {
    Point tmp;
    tmp.x = x - obj.x;
    tmp.y = y - obj.y;
    return tmp;
  }
  Point operator-=(Point obj) {
    x -= obj.x;
    y -= obj.y;
    return *this;
  }
  Point operator+=(Point obj) {
    x += obj.x;
    y += obj.y;
    return *this;
  }
  Point operator/=(double b) {
    x = x / b;
    y = y / b;
    return *this;
  }
  Point operator*=(double b) {
    x = x * b;
    y = y * b;
    return *this;
  }
  double size() { return hypot(x, y); }
  Point unit() { return Point(x / size(), y / size()); }
  Point normal() { return Point(y, -x); }
  double atan() { return atan2(y, x); }
};

bool operator<(Point a, Point b) { return a.x != b.x ? a.x < b.x : a.y < b.y; }
bool operator>(Point a, Point b) { return b < a; }
bool operator<=(Point a, Point b) { return !(b < a); }
bool operator>=(Point a, Point b) { return !(a < b); }
bool operator==(Point a, Point b) { return (a - b).size() < eps; }
bool operator!=(Point a, Point b) { return !(a == b); }

bool equal(double a, double b) { return abs(a - b) < eps; }
double cross(Point a, Point b) { return a % b; }
double dot(Point a, Point b) { return a * b; }

int ccw(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  if (b % c > 0)
    return +1;
  else if (b % c < 0)
    return -1;
  else if (b * c < 0)
    return +2;
  else if (b.size() < c.size())
    return -2;
  else
    return 0;
}

int n, m;
int dp[20005][256];

int main(int argc, char const *argv[]) {
  int n, m;

  while (1) {
    cin >> n >> m;
    if (!n)
      break;
    vi C(m);
    vi x(n);
    fill_n((int *)dp, sizeof(dp) / sizeof(int), inf);
    for (int i = 0; i < m; i++) {
      cin >> C[i];
    }
    for (int i = 0; i < n; i++) {
      cin >> x[i];
    }
    dp[0][128] = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < 256; j++) {
        if (dp[i][j] == inf) {
          continue;
        }
        for (int k = 0; k < m; k++) {
          int yn = j + C[k];
          if (yn > 255)
            yn = 255;
          else if (yn < 0)
            yn = 0;
          int err = (x[i] - yn) * (x[i] - yn);
          dp[i + 1][yn] = min(dp[i + 1][yn], dp[i][j] + err);
        }
      }
    }
    cout << *min_element(dp[n], dp[n] + 256) << endl;
  }
  return 0;
}


Error: MLE

Fixed submission:

#include <algorithm>
#include <array>
#include <climits>
#include <cmath>
#include <cstdio>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
const int MOD = 1000000007;
const int INF = 1000000000;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const double eps = 1e-9;
const int inf = 1e9;
typedef pair<int, int> P;
struct Point {
  double x, y;
  Point() {
    x = 0;
    y = 0;
  }
  Point(double d_x, double d_y) { x = d_x, y = d_y; }
  double operator*(Point obj) { return obj.x * x + obj.y * y; }
  double operator%(Point obj) { return obj.y * x - obj.x * y; }
  Point operator*(double b) {
    Point tmp;
    tmp.x = x * b;
    tmp.y = y * b;
    return tmp;
  }
  Point operator/(double b) {
    Point tmp;
    tmp.x = x / b;
    tmp.y = y / b;
    return tmp;
  }
  Point operator+(Point obj) {
    Point tmp;
    tmp.x = x + obj.x;
    tmp.y = y + obj.y;
    return tmp;
  }
  Point operator-() {
    Point tmp;
    tmp.x = -x;
    tmp.y = -y;
    return tmp;
  }
  Point operator-(Point obj) {
    Point tmp;
    tmp.x = x - obj.x;
    tmp.y = y - obj.y;
    return tmp;
  }
  Point operator-=(Point obj) {
    x -= obj.x;
    y -= obj.y;
    return *this;
  }
  Point operator+=(Point obj) {
    x += obj.x;
    y += obj.y;
    return *this;
  }
  Point operator/=(double b) {
    x = x / b;
    y = y / b;
    return *this;
  }
  Point operator*=(double b) {
    x = x * b;
    y = y * b;
    return *this;
  }
  double size() { return hypot(x, y); }
  Point unit() { return Point(x / size(), y / size()); }
  Point normal() { return Point(y, -x); }
  double atan() { return atan2(y, x); }
};

bool operator<(Point a, Point b) { return a.x != b.x ? a.x < b.x : a.y < b.y; }
bool operator>(Point a, Point b) { return b < a; }
bool operator<=(Point a, Point b) { return !(b < a); }
bool operator>=(Point a, Point b) { return !(a < b); }
bool operator==(Point a, Point b) { return (a - b).size() < eps; }
bool operator!=(Point a, Point b) { return !(a == b); }

bool equal(double a, double b) { return abs(a - b) < eps; }
double cross(Point a, Point b) { return a % b; }
double dot(Point a, Point b) { return a * b; }

int ccw(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  if (b % c > 0)
    return +1;
  else if (b % c < 0)
    return -1;
  else if (b * c < 0)
    return +2;
  else if (b.size() < c.size())
    return -2;
  else
    return 0;
}

int n, m;
int dp[200005][256];

int main(int argc, char const *argv[]) {
  int n, m;

  while (1) {
    cin >> n >> m;
    if (!n)
      break;
    vi C(m);
    vi x(n);
    fill_n((int *)dp, sizeof(dp) / sizeof(int), inf);
    for (int i = 0; i < m; i++) {
      cin >> C[i];
    }
    for (int i = 0; i < n; i++) {
      cin >> x[i];
    }
    dp[0][128] = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < 256; j++) {
        if (dp[i][j] == inf) {
          continue;
        }
        for (int k = 0; k < m; k++) {
          int yn = j + C[k];
          if (yn > 255)
            yn = 255;
          else if (yn < 0)
            yn = 0;
          int err = (x[i] - yn) * (x[i] - yn);
          dp[i + 1][yn] = min(dp[i + 1][yn], dp[i][j] + err);
        }
      }
    }
    cout << *min_element(dp[n], dp[n] + 256) << endl;
  }
  return 0;
}