Problem p03165 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG // これつけるとA[N]でもいいらしい
// for文のマクロ
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define big 1000000007
#define all(a) sort((a).begin(), (a).end()) // ソートのマクロ
#define Re(a) reverse((a).begin(), (a).end())
#define YN(a)                                                                  \
  if (a) {                                                                     \
    cout << "Yes" << endl;                                                     \
  } else                                                                       \
    cout << "No" << endl; // 条件によってYes、Noを出力する
int main() {
  // LCS
  string s, t;
  cin >> s >> t;
  int n = s.length(), m = t.length();
  int dp[301][301] = {};
  // dp[i][j]=i-1文字目まで見た時のLCSの長さ
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (s[i - 1] == t[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
      }
    }
  }
  /*
  rep(i,n+1){
      rep(j,m+1){
          cout<<dp[i][j]<<" ";
      }
      cout<<endl;
  }
  */
  string ans = "";
  int l = n, r = m;
  // line,raw
  while (dp[l][r] != 0) {
    if (dp[l - 1][r] < dp[l][r] && dp[l][r - 1] < dp[l][r]) { // 両方減る
      ans += s[l - 1];
      l--, r--;
    } else if (dp[l - 1][r] == dp[l][r] &&
               dp[l][r - 1] < dp[l][r]) { // 上は減らない、左は減る
      l--;
    } else if (dp[l - 1][r] < dp[l][r] && dp[l][r - 1] == dp[l][r]) {
      r--;
    } else {
      l--;
    }
  }
  Re(ans);
  // cout<<dp[n][m]<<endl;
  cout << ans << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG // これつけるとA[N]でもいいらしい
// for文のマクロ
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define big 1000000007
#define all(a) sort((a).begin(), (a).end()) // ソートのマクロ
#define Re(a) reverse((a).begin(), (a).end())
#define YN(a)                                                                  \
  if (a) {                                                                     \
    cout << "Yes" << endl;                                                     \
  } else                                                                       \
    cout << "No" << endl; // 条件によってYes、Noを出力する
int main() {
  // LCS
  string s, t;
  cin >> s >> t;
  int n = s.length(), m = t.length();
  int dp[3001][3001] = {};
  // dp[i][j]=i-1文字目まで見た時のLCSの長さ s[i]==t[i]だったらdp[i-1]
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (s[i - 1] == t[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
      }
    }
  }
  /*
  rep(i,n+1){
      rep(j,m+1){
          cout<<dp[i][j]<<" ";
      }
      cout<<endl;
  }
  */
  string ans = "";
  int l = n, r = m;
  // line,raw
  while (dp[l][r] != 0) {
    if (dp[l - 1][r] < dp[l][r] && dp[l][r - 1] < dp[l][r]) { // 両方減る
      ans += s[l - 1];
      l--, r--;
    } else if (dp[l - 1][r] == dp[l][r] &&
               dp[l][r - 1] < dp[l][r]) { // 上は減らない、左は減る
      l--;
    } else if (dp[l - 1][r] < dp[l][r] && dp[l][r - 1] == dp[l][r]) {
      r--;
    } else {
      l--;
    }
  }
  Re(ans);
  // cout<<dp[n][m]<<endl;
  cout << ans << endl;
}