幾道動態規劃題

最長連續子序列和

#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;
}
相關文章
相關標籤/搜索