10分求调
查看原帖
10分求调
894452
ky091009楼主2023/8/20 09:36
#include <bits/stdc++.h>
using namespace std;
int lcs(const int* s, int n, const int* t, int m) {
	if (n < m) {
		swap(s, t);
		swap(n, m);
	}
	int* dp = new int[m + 1];
	for (int i = 0; i <= m; i++) dp[i] = 0;
	int len = 0;
	for (int i = 1; i <= n; i++) {
		int p = 0;
		for (int j = 1; j <= m; j++) {
			int c = dp[j];
			if (s[i - 1] == t[j - 1]) {
				dp[j] = p + 1;
				len = max(len, dp[j]);
			} else {
				dp[j] = max(dp[j - 1], dp[j]);
			}
			p = c;
		}
	}
	delete[] dp;
	return len;
}

int main() {
	ios::sync_with_stdio(false);
	int n, m, c1, c2;
	cin >> n >> m >> c1 >> c2;
	int* s = new int[n];
	int* t = new int[m];
	for (int i = 0; i < n; i++)	cin >> s[i];
	for (int i = 0; i < m; i++)	cin >> t[i];
	if (c1 == 0 && c2 == 0) {
		cout << 0 << " " << 0;
		delete[] s;
		delete[] t;
		return 0;
	}
	int k = 0;
	int mx = 0;
	int l = lcs(s, n, t, m);
	while (l > mx) {
		mx = l;
		k++;
		int* new_s = new int[n + n];
		for (int i = 0; i < n; i++) {
			new_s[i] = s[i];
			new_s[i + n] = s[i];
		}
		delete[] s;
		s = new_s;
		n += n;
		l = lcs(s, n, t, m);
	}
	cout << c1 * mx << " " << c2 * k << endl;
	delete[] s;
	delete[] t;
	return 0;
}
2023/8/20 09:36
加载中...