AcWing 895. 最长上升子序列的具体序列
原题链接
中等
作者:
别期待太多
,
2025-01-15 23:21:38
,
所有人可见
,
阅读 2
const int N = 1010;
int n,a[N],f[N],pre[N];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++)//基于1的下标
scanf("%d", &a[i]);
int end = 1;
for(int i = 1; i <= n; i ++)//找每个数作为结尾的最长上升子序列
{
f[i] = 1;//子序列的长度至少为1
for(int j = 1; j < i; j ++)//a[1]~a[i-1]都有可能是前节点
{
if(a[j]<a[i] && f[j]+1>f[i])
{
f[i] = f[j]+1;//状态转移
pre[i] = j;//记录前节点索引
//直接寻找最长上升子序列的尾节点索引
if(f[end] < f[i])
end = i;
}
}
}
printf("%d\n", f[end]);
//因为是基于1的索引,所以0就是非法的节点索引,即为边界
for(int i = end; i != 0; i = pre[i])
printf("%d ",a[i]);
return 0;
}