SSL2812 2017年10月30日提高组T2 凤凰院凶真(dp,LCIS)

来源:互联网 发布:人工智能 用什么开发 编辑:程序博客网 时间:2024/05/20 19:16

2017年10月30日提高组T2 凤凰院凶真

Description

这里写图片描述

Input

这里写图片描述

Output

第一行一个整数k,表示最长公共合法事件序列的长度。

Sample Input
5
1 4 2 5 1
4
1 1 2 4
Sample Output
2
Hint

【数据规模和约定】
这里写图片描述

分析:考虑 DP. 设状态 dp(i, j) 表示 a 序列考虑到 i, b 序列考虑到 j 并且必须选 bj 的最大长度. 当 ai = bj 时, 显然有转移 dp(i, j) = max {dp(i − 1, k)} + 1(k< j,bk< bj ). 于是从小到大枚举 j, 维护 max{dp(i − 1, k)}(k< j,bk< ai), 顺便记录一下最大值的位置,直接转移即可.

#include <cstdio>#define maxn 6000using namespace std;int f[maxn],a[maxn],b[maxn];int n,m;int max(int x,int y){    return x>y?x:y;}int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++)        scanf("%d",&a[i]);    scanf("%d",&m);    for (int i=1;i<=m;i++)        scanf("%d",&b[i]);    for (int i=1;i<=n;i++)    {        int p=0;        for (int j=1;j<=m;j++)            if (a[i]==b[j]) f[j]=max(f[j],f[p]+1);            else if (a[i]>b[j]&&f[j]>f[p]) p=j;    }    int ans=0;    for (int i=1;i<=m;i++)        if (f[i]>ans) ans=f[i];    printf("%d",ans);
阅读全文
0 0
原创粉丝点击