最长上升子序列:
#include<bits/stdc++.h> using namespace std; #define inf 0x3fffffff const int maxn=1010; int A[maxn]; int dp[maxn]; //最长上升子序列 int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>A[i]; } dp[0]=A[0]; for(int i=1;i<n;i++){ dp[i]=max(A[i],dp[i-1]+A[i]); } int k=0; for(int i=1;i<n;i++){ if(dp[i]>dp[k]){ k=i; } } cout<<dp[k]<<endl; return 0; } //6 //-2 11 -4 13 -5 -2 //20
最长不下降子序列:
#include<bits/stdc++.h> using namespace std; #define inf 0x3fffffff const int maxn=1010; int A[maxn]; int dp[maxn]; //最长不下降子序列 int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>A[i]; dp[i]=1; } for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(A[j]<=A[i]&&dp[j]+1>dp[i]){ dp[i]=dp[j]+1; } } } int maxL=-1; for(int i=0;i<n;i++){ if(dp[i]>maxL){ maxL=dp[i]; } } cout<<maxL<<endl; return 0; } //8 //1 2 3 -9 3 9 0 11 //6
最长公共子序列:
#include<bits/stdc++.h> using namespace std; #define inf 0x3fffffff const int maxn=1010; int dp[maxn][maxn]; //最长公共子序列 int main(){ string s1; string s2; cin>>s1>>s2; int len1=s1.size(); int len2=s2.size(); for(int i=0;i<=len1;i++){ dp[i][0]=0; } for(int i=0;i<=len2;i++){ dp[0][i]=0; } for(int i=1;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(s1[i]==s2[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[len1][len2]<<endl; return 0; }