一、最大连续子序列
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入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列
原文:https://www.cnblogs.com/fireinstone/p/15158810.html