Problem p03165 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

long long int arr[1000000][2], ans[105][100003];
vector<long long int> crr;
long long int W, N;

int dp[3005][3005];

vector<char> lcs(string s, string t) {
  int n = s.size();
  int m = t.size();

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (s[i] == t[j]) {
        dp[i + 1][j + 1] = 1 + dp[i][j];
      } else {
        dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
      }
    }
  }

  vector<char> ans;
  int last = m;
  int val = dp[n][m];

  // for (int i = 0; i <=n; ++i)
  // {
  // 	for(int j=0;j<=m;j++)
  // 	{
  // 			cout<<dp[i][j]<<" ";
  // 	}
  // 	cout<<endl;
  // }

  // for (int i = n; i >= 0; --i)
  // {
  // 	for (int j = last; j >=0; --j)
  // 	{
  // 		if(dp[i][j]==val)
  // 		{
  // 			last=j;
  // 		}
  // 		else
  // 		{
  // 		//	cout<<i<<" "<<j<<endl;
  // 			ans.push_back(t[j]);
  // 			last=j;
  // 			val--;
  // 			break;
  // 		}
  // 	}

  // }

  for (int i = n; i >= 0; --i) {
    for (int j = last; j >= 0; --j) {
      if (s[i - 1] == t[j - 1]) {
        ans.push_back(s[i - 1]);
        last = j - 1;
        break;
      } else if (dp[i - 1][j] > dp[i][j - 1]) {
        last = j;
        break;
      }
    }
  }
  return ans;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int n, a, b, c, d, w;
  string s, t;
  cin >> s >> t;

  for (int i = 0; i < 3005; ++i) {
    for (int j = 0; j < 3005; j++) {
      if (i != 0 && j != 0)
        dp[i][j] = -1;
    }
  }
  vector<char> ans;
  ans = lcs(s, t);
  reverse(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); ++i) {
    cout << ans[i];
  }
  cout << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;

long long int arr[1000000][2], ans[105][100003];
vector<long long int> crr;
long long int W, N;

int dp[3005][3005];

vector<char> lcs(string s, string t) {
  int n = s.size();
  int m = t.size();

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (s[i] == t[j]) {
        dp[i + 1][j + 1] = 1 + dp[i][j];
      } else {
        dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
      }
    }
  }

  vector<char> ans;
  int last = m;
  int val = dp[n][m];

  // for (int i = 0; i <=n; ++i)
  // {
  // 	for(int j=0;j<=m;j++)
  // 	{
  // 			cout<<dp[i][j]<<" ";
  // 	}
  // 	cout<<endl;
  // }

  // for (int i = n; i >= 0; --i)
  // {
  // 	for (int j = last; j >=0; --j)
  // 	{
  // 		if(dp[i][j]==val)
  // 		{
  // 			last=j;
  // 		}
  // 		else
  // 		{
  // 		//	cout<<i<<" "<<j<<endl;
  // 			ans.push_back(t[j]);
  // 			last=j;
  // 			val--;
  // 			break;
  // 		}
  // 	}

  // }

  for (int i = n; i > 0; --i) {
    for (int j = last; j > 0; --j) {
      if (s[i - 1] == t[j - 1]) {
        ans.push_back(s[i - 1]);
        last = j - 1;
        break;
      } else if (dp[i - 1][j] > dp[i][j - 1]) {
        last = j;
        break;
      }
    }
  }
  return ans;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int n, a, b, c, d, w;
  string s, t;
  cin >> s >> t;

  for (int i = 0; i < 3005; ++i) {
    for (int j = 0; j < 3005; j++) {
      if (i != 0 && j != 0)
        dp[i][j] = -1;
    }
  }
  vector<char> ans;
  ans = lcs(s, t);
  reverse(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); ++i) {
    cout << ans[i];
  }
  cout << endl;
  return 0;
}