BestCoder Round #87 1003 LCIS[序列DP]

LCIS

Accepts: 109

Submissions: 775

Time Limit: 4000/2000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

Alex有两个序列a1a2...ana?1??,a?2??,...,a?n??和b1b2...bmb?1??,b?2??,...,b?m??. 他想找到它们的最长公共递增子序列, 并且这个子序列的值是连续的(xx1...y1yx,x+1,...,y−1,y).

输入描述

输入包含多组数据, 第一行包含一个整数TT表示测试数据组数. 对于每组数据:

第一行包含两个整数nn和mm 1nm100000(1≤n,m≤100000)表示两个序列的长度. 第二行包含nn个整数: a1a2...ana?1??,a?2??,...,a?n?? 1ai106(1≤a?i??≤10?6??). 第三行包含mm个整数: b1b2...bmb?1??,b?2??,...,b?m?? 1bi106(1≤b?i??≤10?6??).

输入最多有10001000组数据, 并且所有数据中nn与mm的和不超过21062×10?6??.

输出描述

对于每组数据, 输出一个整数表示长度.

输入样例

3
3 3
1 2 3
3 2 1
10 5
1 23 2 32 4 3 4 5 6 1
1 2 3 4 5
1 1
2
1

输出样例

1
5
0

本题多了一个要求,上升必须是依次递增一开始还想用f[i]表示以a[i]结尾,然而并不方便(应该能做,开一个mx[i]表示值大小为i的f值最大的编号)直接f[i]表示a以i结尾的"LIS",g[i]表示b的处理g时顺便更新答案行了

ps:代码里有一些奇怪的卡常请无视
//
//  main.cpp
//  bc87-1003
//
//  Created by Candy on 10/1/16.
//  Copyright © 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
using namespace std;
const int N=1e5+5,V=1e6+5;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x;
}
int T,n,m,a[N],b[N],f[V],g[V];
int main(int argc, const char * argv[]){
    T=read();
    while(T--){
        n=read();m=read();
        int ans=0,la=0,lb=0;
        for(int i=1;i<=n;i++) a[i]=read();//la=max(la,a[i]=read());
        for(int i=1;i<=m;i++) b[i]=read();//lb=max(lb,b[i]=read());
        for(int i=1;i<=n;i++)
            f[a[i]]=max(f[a[i]],f[a[i]-1]+1);
        for(int i=1;i<=m;i++){
            g[b[i]]=max(g[b[i]],g[b[i]-1]+1);
            ans=max(ans,min(f[b[i]],g[b[i]]));
        }
        printf("%d\n",ans);//la++;lb++;
        //memset(f,0,la*sizeof(int));
        //memset(g,0,lb*sizeof(int));
        for(int i=1;i<=n;i++) f[a[i]]=0;
        for(int i=1;i<=m;i++) g[b[i]]=0;
    }
    return 0;
}

 
时间: 2024-10-05 05:01:59

BestCoder Round #87 1003 LCIS[序列DP]的相关文章

BestCoder Round #13 1003(单调性DP)HDU5064

Find Sequence Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 68    Accepted Submission(s): 12 Problem Description Give you an positive integer sequence a1,a2,-,ai,-,an, and they satisfy a1+a

BestCoder Round #87 1002 Square Distance[DP 打印方案]

Square Distance Accepts: 73 Submissions: 598 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", "abba"不是. 两个长度相同字

HDU 5904 - LCIS (BestCoder Round #87)

HDU 5904 - LCIS [ DP ]    BestCoder Round #87 题意: 给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的 分析: 状态转移方程式: dp[a[i]] = max(dp[a[i]], dp[a[i]-1] + 1); 发现其实可以简化为 dp[a[i]] = dp[a[i]-1] + 1:因为计算过程中dp[a[i]]不会降低 对两个序列都求一遍,然后取两者最小值的最大值 1 #include <cstdio> 2 #inc

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh

HDU 5806 NanoApe Loves Sequence Ⅱ(尺取+思维)——BestCoder Round #86 1003

传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 514    Accepted Submission(s): 248 Problem Description NanoApe, the Retired Dog, has returned back to prepare for f

HDU 5778 abs(暴力枚举)——BestCoder Round #85 1003

传送门 abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1474    Accepted Submission(s): 511 Problem Description Given a number x, ask positive integer y≥2, that satisfy the following condition

HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )

题意: 给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s, 要求字典序最小的答案    分析: dp[i][j] 表示 第i位及之后的总代价为j可不可行 从第 n/2-1 位推回第 0 位, 若dp[0][m] = 1,则存在 然后贪心对每一位从'a'试到'z',选取接下来存在解的字符 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #inclu

HDU 5682/BestCoder Round #83 1003 zxa and leaf 二分+树

zxa and leaf Problem Description zxa have an unrooted tree with n nodes, including (n−1) undirected edges, whose nodes are numbered from 1 to n. The degree of each node is defined as the number of the edges connected to it, and each node whose degree