小h的消息加密
题目描述
小h最近看了谍战电影,对里面消息的加密方式很感兴趣,他决定和朋友试一试,小h给朋友两个序列,两个序列的最长公共单调递增子序列就是要传递的消息,有时候序列太长了,小h的朋友找不出来,所以他找到了你
输入
第一个数字n表示序列长度
后面两行每行n个数字表示小h给出的两个序列
(n<=1000)
输出
输出需要传递的原序列的长度
样例输入
3
1 2 3
3 1 2
样例输出
2
#include<bits/stdc++.h>
#define ll long long
const int inf=0x3f3f3f3f;
using namespace std;
const int maxn=505;
int main(){
int n,a[maxn],b[maxn],dp[maxn][maxn];
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
int maxs=0;
for(int j=1;j<=n;j++){
dp[i][j]=dp[i-1][j];
if(a[i]>b[j]&&maxs<dp[i-1][j]){
maxs=dp[i-1][j];
}
if(a[i]==b[j]){
dp[i][j]=maxs+1;
}
}
}
int len=0;
for(int i=1;i<=n;i++){
len=max(len,dp[n][i]);
}
cout<<len<<endl;
}
一个序列中的最长上升子序列(LISLIS)(n^2)
#include<bits/stdc++.h>
#define ll long long
const int inf=0x3f3f3f3f;
using namespace std;
const int maxn=1e5+5;
int main(){
int n,a[maxn],b[maxn],dp[maxn];
cin>>n;
int maxs;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(a[j]<a[i]&&dp[i]<dp[j]+1)
dp[i]=dp[j]+1;
}
}
maxs=dp[n];
cout<<maxs<<endl;
}