2018.10.03 决斗(dp+set)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/82934869

描述

50年代的蓝星并不宁静
兔酱:鹰酱!去死吧!
麦跑跑:打不过,我跑吧。
李轰轰:兔兔,你们是打不过我的磁链战术的!
秃子:经儿啊,社稷只能留在你手中了。
七绝•试仿陆放翁《示儿》
1958年12月21日
人类今娴上太空,
但悲不见五洲同。
愚公尽扫餮蚊日,
公祭无忘告马翁。

兔兔和李轰轰最后的一战:
阵前
来者可是兔酱?
正是在下。
“李轰轰又来叫阵了!,欺我种花家无人吗?”
何人敢应战?
“兴初请战”
为了简化梁兴初和李轰轰的对决,我们将梁兴初和李轰轰数据化得到
梁兴初有N个招式,每个招式可以造成Ai点伤害
李轰轰有M个招式,每个招式可以造成Bi点伤害
为了体现兔酱家制度的优越性,梁兴初决定在一瞬间打出这N个招式,这N个招式可以造成[A数组,B数组的最长公共子序列长度]+1的额外伤害
兴初现在想知道能够造成多少点额外伤害?

输入

第一行两个整数N,M,分别表示梁兴初,李轰轰的招式数目
接下来一行,N个整数Ai,分别表示兔兔第i个招式的伤害
接下来一行,M个整数Bi,分别表示鹰酱第i个招式的伤害
数据保证:
1≤N,M≤10^6
|Ai,Bi|≤10^9
Ai互不相同

输出

答案

样例输入

4 4
1 2 3 4
1 2 3 4

样例输出

5

标签

Leo


LCS板题。
说了那么多废话,其实就是要求 L C S LCS 长度+1.
直接上STL乱搞优化dp就行了。
代码:

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,m,a[N];
inline int read(){
    int ans=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans*w;
}
map<int,int>mp;
int main(){
    n=read();
    memset(a,0x3f,sizeof(a));
    for(int i=1;i<=n;++i)mp[read()]=i;
    for(int i=1;i<=n;++i){
        int now=mp[read()];
        if(!now)continue;
        a[lower_bound(a+1,a+n+1,now)-a]=now;
    }
    printf("%d",1+lower_bound(a+1,a+n+1,a[0])-a-1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/82934869
set