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; }