动规专题

最长上升子序列:

#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;
}

 

posted @ 2021-04-16 16:43  XA科研  阅读(53)  评论(0编辑  收藏  举报