正常思路我们是用dp写
dp的状态转移方程
可是因为二维数组l开出来后会mle所以我们就要考虑优化
/**
课外提示一个知识点
求最长递增子序列
int solve(int n)
{
int z=0;
for(int i=1; i<=n; i++)
{
if(i==1)
num[++z]=a[i];
else if(a[i]>num[z])
num[++z]=a[i];
else
{
int mid=lower_bound(num+1,num+z,a[i])-num;
num[mid]=a[i];
}
}
return z;
}
——————————————————————
a[i]是我们的数组
num【i】存储的是最长递增子序列///感觉这么写好巨。。。
**/
找最长公共子序列
我们需要的是一个数组中的元素在另外一个数组中存在
且存在的位置是单调递增的。
所以我们把他们的位置信息存储以后找出最长递增的位置串
///————————————)——————+——————————
百度巨巨的思路
map映射出一个数组存储 a数组各个变量的位置在a中找b对应的位置
废话辣么多上代码
int solve(int n) { int z=0; for(int i=1; i<=n; i++) { if(i==1) num[++z]=a[i]; else if(a[i]>num[z]) num[++z]=a[i]; else { int mid=lower_bound(num+1,num+z,a[i])-num; num[mid]=a[i]; } } return z; }
这是最长递增子序列
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> using namespace std; int num[1000003]; int a[1000003]; int solve(int n) { int z=0; for(int i=1; i<=n; i++) { if(i==1) num[++z]=a[i]; else if(a[i]>num[z]) num[++z]=a[i]; else { int mid=lower_bound(num+1,num+z,a[i])-num; num[mid]=a[i]; } } return z; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); map<int ,int >pos; memset(num,0,sizeof(num)); for(int i=1; i<=n; i++) { int c; scanf("%d",&c); pos[c]=i; } for(int i=1; i<=m; i++) { int x; scanf("%d",&x); if(pos[x]) a[i]=pos[x]; else a[i]=-1; } int ans=solve(m); printf("%d\n",ans); } }