제출 #820220

#제출 시각아이디문제언어결과실행 시간메모리
820220ZaniteExam (eJOI20_exam)C++17
65 / 100
557 ms295416 KiB
#include <bits/stdc++.h>
using namespace std;

const int iINF	= 1e9;
const int maxN	= 5023;

int N, M, A[maxN], B[maxN];
vector<int> compress;
int dp[maxN][maxN], mx[maxN][maxN], pf[maxN][maxN];

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> A[i];
		compress.push_back(A[i]);
	}
	for (int i = 1; i <= N; i++) {
		cin >> B[i];
		compress.push_back(B[i]);
	}

	sort(compress.begin(), compress.end());
	compress.erase(unique(compress.begin(), compress.end()), compress.end());
	M = compress.size();
	for (int i = 1; i <= N; i++) {
		A[i] = lower_bound(compress.begin(), compress.end(), A[i]) - compress.begin() + 1;
		B[i] = lower_bound(compress.begin(), compress.end(), B[i]) - compress.begin() + 1;
	}
	
	for (int l = 1; l <= N; l++) {
		mx[l][l] = A[l];
		for (int r = l+1; r <= N; r++) {
			mx[l][r] = max(mx[l][r-1], A[r]);
			mx[r][l] = mx[l][r];
		}
	}

	for (int i = 1; i <= N; i++) {
		for (int val = 1; val <= N; val++) {
			pf[i][val] = -iINF;
		}
	}

	pf[0][0] = 0;
	for (int i = 1; i <= N; i++) {
		for (int val = 1; val <= N; val++) {
			if (mx[val][i] == A[val]) {
				dp[i][val] = pf[i-1][val] + (B[i] == A[val]);
				// cout << "dp[" << i << "][" << val << "] = " << dp[i][val] << '\n';
			} else {
				dp[i][val] = -iINF;
			}

			pf[i][val] = max(pf[i][val-1], dp[i][val]);
		}
	}

	int ans = pf[N][N];
	cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...