一、最大上升子序列和裸题:
#include <bits/stdc++.h>
using namespace std;
const int N=1100;
int a[N];
int f[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int res=0;
for(int i=1;i<=n;i++){
f[i]=a[i];
for(int j=1;j<i;j++){
if(a[j]<a[i]) f[i]=max(f[i],f[j]+a[i]);
}
}
for(int i=1;i<=n;i++) res=max(res,f[i]);
printf("%d",res);
return 0;
}
二、导弹拦截 P1020(洛谷)
时间复杂度
#include <bits/stdc++.h>
using namespace std;
const int N=1100;
int a[N];
int f[N],g[N];
int main(){
int n=1;
while(cin>>a[n]) n++;
int res=0;
for(int i=1;i<n;i++){
f[i]=1;
for(int j=1;j<i;j++){
if(a[j]>=a[i]) f[i]=max(f[i],f[j]+1);
}
res=max(res,f[i]);
}
cout<<res<<endl;
int cnt=0;
for(int i=1;i<n;i++){
int k=0;
while(k<cnt&&g[k]<q[i]) k++;
g[k]=q[i];
if(k>=cnt) cnt++;
}
cout<<cnt;
return 0;
}
三、最长上升公共子序列 (仅求数量)
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N],b[N];
int f[N][N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s%s",a+1,b+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
printf("%d",f[n][m]);
return 0;
}