最长公共子序列转最大上升子序列(洛谷p1439)
Posted yeah17981
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列转最大上升子序列(洛谷p1439)相关的知识,希望对你有一定的参考价值。
又是一事无成的一天呢
但是不得不水一篇,毕竟我是个有始有终的人(bushi)
今天这题是几个礼拜前刷dp题刷到的
明天找题号
P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
给两个1-n的全排列,求最长公共子序列
我觉得题解通过把原序列中的其中一个转换成1-n的序列,另一个按照转化关系转成新序列,然后求新序列的最大上升子序列的方法很好玩
例
52314
21453
我们再加一行成
52314
21453
12345
序列2和3形成新的转化关系
1➡2
2➡1
3➡5
4➡3
5➡4
序列1即为41523,最长上升子序列是3,245位,看原序列确实如此()
代码
#include<bits/stdc++.h>
using namespace std;
int st[100005],yu[1000005],dp[100005];
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
st[m]=i;
}
// for(int i=1;i<=n;i++)
// {
// cout<<st[i];
// }
// C++ Version
for(int i=1;i<=n;i++)
{
cin>>m;
yu[i-1]=st[m];
}
// for (int i = 0; i < n; ++i) scanf("%d", a + i);
memset(dp, 0x1f, sizeof dp);
int mx = dp[0];
for (int i = 0; i < n; ++i) {
*std::upper_bound(dp, dp + n, yu[i]) = yu[i];
}
int ans = 0;
while (dp[ans] != mx) ++ans;
cout<<ans;
}
以上是关于最长公共子序列转最大上升子序列(洛谷p1439)的主要内容,如果未能解决你的问题,请参考以下文章