B题
处理出A数组选i个(1<=i<=n)的字典序最大的子序列,把B的也处理出来
在枚举用A的x个和用B的l-x个,将答案存下
最后排序输出最大的即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int n, m, l;
ll a[510], b[510];
vector<ll> v1[510], v2[510];
vector<ll> v[510];
bool vis[510];
int main() {
scanf("%d%d%d", &n, &m, &l);
for (int i = 1; i <= n; i++)scanf("%lld", &a[i]);
for (int i = 1; i <= m; i++)scanf("%lld", &b[i]);
//处理A
for (int i = 1; i <= n; i++) {
int k = 1;
for (int s = 1; s <= i; s++) {
int ma = 0;
for (int j = k; j <= n - i + s; j++) {
if (a[j] > ma) {
ma = a[j];
k = j + 1;
}
}
v1[i].push_back(ma);
}
}
//处理B
for (int i = 1; i <= m; i++) {
int k = 1;
for (int s = 1; s <= i; s++) {
int ma = 0;
for (int j = k; j <= m - i + s; j++) {
if (b[j] > ma) {
ma = b[j];
k = j + 1;
}
}
v2[i].push_back(ma);
}
}
//合并
int ll = max(0, l - m), rr = min(n, l);
for (int i = ll; i <= rr; i++) {
int j1 = 0, j2 = 0;
while (j1 < v1[i].size() || j2 < v2[l - i].size()) {
if (j1 == v1[i].size()) {
v[i].push_back(v2[l - i][j2]);
j2++;
} else if (j2 == v2[l - i].size()) {
v[i].push_back(v1[i][j1]);
j1++;
} else if (v1[i][j1] > v2[l - i][j2]) {
v[i].push_back(v1[i][j1]);
j1++;
} else if (v1[i][j1] < v2[l - i][j2]) {
v[i].push_back(v2[l - i][j2]);
j2++;
} else {
int jj1 = j1, jj2 = j2;
while (jj1 < v1[i].size() && jj2 < v2[l - i].size() && v1[i][jj1] == v2[l - i][jj2]) {
jj1++;
jj2++;
}
if (jj1 == v1[i].size())v[i].push_back(v2[l - i][j2]), j2++;
else if (jj2 == v2[l - i].size())v[i].push_back(v1[i][j1]), j1++;
else if (v1[i][jj1] > v2[l - i][jj2]) {
v[i].push_back(v1[i][j1]);
j1++;
} else {
v[i].push_back(v2[l - i][j2]);
j2++;
}
}
}
}
sort(v + ll, v + rr + 1);
for (auto i:v[rr])printf("%lld ", i);
return 0;
}
京公网安备 11010502036488号