几道动态规划题

最长连续子序列和

#include<cstdio> 
#include<algorithm>
using namespace std;

const int maxn=10010;
int A[maxn],dp[maxn];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&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;
        }
    }
    printf("%d\n",dp[k]);

    return 0;
}

最长不降低子序列

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=110;
int A[N],dp[N];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
    }
    int ans=-1;
    for(int i=1;i<=n;i++){
        dp[i]=1;
        for(int j=1;j<i;j++){
            if(A[i]>=A[j]&&(dp[j]+1)>dp[i]){
                dp[i]=dp[j]+1;
            }
        }
        ans=max(ans,dp[i]);
    }
    
    printf("%d",ans);
    
    return 0;
}

最长回文串

若[i,j]之间的字符串回文,则dp[i][j]=1,不然dp[i][j]=0;
先令 [i,j] 的长度L为1,即i=j,而后逐渐增大,当L大于3,若是dp[i-1][j-1]=1&&s[i]==s[j],则dp[i][j]=1;
相关问题:1040 Longest Symmetric String (25 分)ios

#include<iostream>
#include<string>
using namespace std;

const int maxn=1010;
int dp[maxn][maxn];

int main(){
    string s;
    getline(cin,s);
    int ans=1;
    int len=s.length();
    for(int i=0;i<len;i++){
        dp[i][i]=1;
        if(i<len-1){
            if(s[i]==s[i+1]){
                dp[i][i+1]=1;
                ans=2;
            }
        }
    }
    for(int L=3;L<=len;L++){
        for(int i=0;i+L-1<len;i++){
            int j=i+L-1;
            if(s[i]==s[j]&&dp[i+1][j-1]==1){
                dp[i][j]=1;
                ans=L;
            }
        }
    }
    printf("%d\n",ans);
    
    return 0;
}

最长公共子序列

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int N=110;
char A[N],B[N];
int dp[N][N];

int main(){
    gets(A+1);
    gets(B+1);
    int lenA=strlen(A+1);
    int lenB=strlen(B+1);
    for(int i=0;i<lenA;i++){
        dp[i][0]=0;
    }
    for(int i=0;i<lenB;i++){
        dp[0][i]=0;
    }
    for(int i=1;i<=lenA;i++){
        for(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]);
            }
        }
    }
    printf("%d\n",dp[lenA][lenB]);
    
    return 0;
}
相关文章
相关标签/搜索