动态规划DP入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列

一、最大连续子序列

1.题目叙述

对于一个数字序列A1A2A3...An,求出连续子序列的最大和,如对于序列-2,11,-4,13,-5,-2,其中的最大序列和是11+(-4)+13=20 

2.动态规划解法

将问题拆分成子问题,即dp[i]表示以A[i]为结尾的子序列的最大和,最后对于这些dp数组找出最大值即可,状态转移方程为:

dp[i] = max{ dp[i-1] + A[i] }  状态dp[i]表示,当前以A【i】结尾的子序列的最大和

3.方法一是经典算法,方法二是根据状态方程优化而来。

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

int maxSum1(int arr[],int n){
    int dp[10];
    int ans = INT32_MIN;
    dp[0] = arr[0];//初始化
    for(int i=1;i<n;i++){
        dp[i] = max(dp[i-1]+arr[i], arr[i]);
        ans = max(ans,dp[i]);
    }
    return ans;
}

int maxSum2(int arr[],int n){
    int dp = arr[0];
    int m = arr[0];
    for(int i=1;i<n;i++){
        if(dp<0){
            dp = arr[i];
        }
        else dp+=arr[i];
        if(dp>m){
            m = dp;
        }
    }
    return m;
}

int main(){
    //-2,6,-1,5,4,-7,2,3
    //dp[i] = max{dp[i-1]+A[i], A[i]}
    int arr[8]={-2,6,-1,5,4,-7,2,3};
    cout<<"algorithm 1: "<<maxSum1(arr,8)<<endl;
    cout<<"algorithm 2: "<<maxSum2(arr,8)<<endl;
    return 0;
}

 

  二、最长不下降子序列(可以不连续)

 

动态规划DP入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列

上一篇:使用虚拟机备份软件恢复XSKY XECCP虚拟机


下一篇:秒杀系统的构建(2)