CF10D LCIS
CF10D LCIS - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
是远古的 CF 题一枚呀。
不难想到状态,
然后会发现,保证上升的这一部分转移是比较难以进行的,因为我们想得到单调性,却没有一个明确的比较目标。
回顾 LIS 的做法,
那么修改状态,
这样转移方程就很好写了,我们令
边界:
容易看出,直接这么写是
发现瓶颈在于
因此枚举
用一个变量滚动地维护
记录方案直接 dp 时记录前驱。
/*
* @Author: crab-in-the-northeast
* @Date: 2022-11-06 00:59:09
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2022-11-06 03:02:53
*/
#include <bits/stdc++.h>
inline int read() {
int x = 0;
bool flag = true;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-')
flag = false;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
if(flag)
return x;
return ~(x - 1);
}
const int maxn = 505;
const int maxm = 505;
int a[maxn], b[maxm];
int f[maxn][maxm];
int pre[maxn][maxm];
void pr(int x, int n) {
if (x == 0)
return ;
pr(pre[n][x], n);
printf("%d ", b[x]);
}
int main() {
int n = read();
for (int i = 1; i <= n; ++i)
a[i] = read();
int m = read();
for (int i = 1; i <= m; ++i)
b[i] = read();
a[0] = b[0] = -1;
for (int i = 1; i <= n; ++i) {
int k = 0;
for (int j = 1; j <= m; ++j) {
if (a[i] != b[j]) {
f[i][j] = f[i - 1][j];
pre[i][j] = pre[i - 1][j];
} else {
f[i][j] = f[i - 1][k] + 1;
pre[i][j] = k;
}
if (b[j] < a[i] && f[i - 1][j] > f[i - 1][k])
k = j;
}
}
int st = 0;
for (int i = 1; i <= m; ++i)
if (f[n][i] > f[n][st])
st = i;
printf("%d\n", f[n][st]);
pr(st, n);
puts("");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】