演算法模板(二)子序列問題
阿新 • • 發佈:2018-11-08
最長公共子序列
#include<bits/stdc++.h> using namespace std; int dp[200][200]; int lena,lenb,n; int a[200],b[200]; int main(){ cin>>n; for(register int i=1;i<=n;i++)cin>>a[i]; for(register int i=1;i<=n;i++)cin>>b[i]; lena=n;lenb=n; for(register int i=1;i<=lena;i++){ for(register int j=1;j<=lenb;j++){ if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } cout<<dp[lena][lenb]; return 0; }
最長上升/下降/不升/不降子序列
#include<bits/stdc++.h> using namespace std; int n; int a[maxn],g[maxn],f[maxn]; int main(){ cin>>n; for(register int i=1;i<=n;i++)cin>>a[i]; for(register int i=1;i<=n;i++)g[i]=0x3f3f3f3f,f[i]=0; int ans=0; for(register int i=1;i<=n;i++){ f[i]=lower_bound(g+1,g+1+ans,a[i])-g; g[f[i]]=a[i]; ans=max(f[i],ans); } cout<<ans<<endl; return 0; }