CH5101 LICS//hdu5904 LICS
Posted saigyouji-yuyuko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CH5101 LICS//hdu5904 LICS相关的知识,希望对你有一定的参考价值。
恭喜我已经正式沦为pj组选手QwQ
一、CH上的:裸题,求LICS。n<=3000
经典普及组dp题,题解烂大街了。所以对于这题,只讲细节:
$1.A_i=B_j时的转移(或者说继承)f[i][j]=f[i-1][j]可有可无。$
$可以想到两个末尾相等时由A的前i-1个,B不以B_j为结尾的状态转移$
$LICS长最多少掉一个。$
$那么这样取到的前面max(f[i-1][k])至少会是f[i-1][j]-1,再加上最后相等的1个$
$一定不会比f[i-1][j]差。所以这句有无皆可。(当然我自己写是不会想这么多的)$
$2.前缀max优化,这个不必说了$
我好菜啊啊啊 啊啊啊啊啊 啊啊啊啊
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #define dbg(x) cerr<<#x<<" = "<<x<<endl 8 #define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl 9 using namespace std; 10 typedef long long ll; 11 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;} 12 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;} 13 template<typename T>inline T _min(T A,T B){return A<B?A:B;} 14 template<typename T>inline T _max(T A,T B){return A>B?A:B;} 15 template<typename T>inline T read(T&x){ 16 x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1; 17 while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x; 18 } 19 const int N=3000+7; 20 int f[N][N],a[N],b[N],m,n,maxv,ans; 21 22 int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout); 23 m=read(n); 24 for(register int i=1;i<=n;++i)scanf("%d",&a[i]);for(register int i=1;i<=n;++i)scanf("%d",&b[i]); 25 for(register int i=1;i<=n;++i){ 26 maxv=0; 27 for(register int j=1;j<=m;++j){ 28 if(a[i]==b[j])f[i][j]=maxv+1; 29 else f[i][j]=f[i-1][j],b[j]<a[i]?MAX(maxv,f[i-1][j]):0; 30 MAX(ans,f[i][j]); 31 } 32 } 33 return printf("%d ",ans),0; 34 }
二、hdu上的:跪于英语不好。。
Original:He wants find a longest common subsequence that consists of consecutive values in increasing order.
也就是LICS要求是连续上升的(也就是公差是1)
那这不就简单了么。
两数组各做一遍dp,求以这个数结尾的最大连续长度。最后比对一下。
没了。code不放了。
以上是关于CH5101 LICS//hdu5904 LICS的主要内容,如果未能解决你的问题,请参考以下文章