2.MaxSubArray-Leetcode

题目:最大连续子序列和
思路:动态规划
状态转移方程
f[j]=max{f[j-1]+s[j],s[j]}, 其中1<=j<=n
target = max{f[j]}, 其中1<=j<=n

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
    if(nums.size()==0)return -1;
    if(nums.size()==1)return nums[0];
    vector<int>  res_vec(nums.size());
    res_vec[0]=nums[0];
    int max_val = nums[0];
    for(vector<int>::size_type i=1;i<nums.size();++i)
    {
        res_vec[i]=max(res_vec[i-1]+nums[i],nums[i]);
        if(max_val<res_vec[i])max_val = res_vec[i];   
    }
    return max_val;
    }
};

下面给出一个类似的题:
给定一个整数的数组,相邻的数不能同时选,求从该数组选取若干整数,使得他们的和最大,要求只能使用o(1)的空间复杂度。要求给出伪码。

f(n)A[n]
f(n)=max(f(n1),max(f(n2)+A[n],A[n])

int getMax(int a[],int len)
{  
   int max1 = a[0];//表示maxSum(n-2);  
   int max2 = a[0]>a[1]? a[0]:a[1]; //表示maxSum(n-1);  
   int max3 = 0; // n 
   for(int i =2; i<len; i++){    
   max3 = Max(a[i],Max(max1+a[i],max2));
        max1 = max2; 
        max2  = max3; 
   } 
    return max3;
}
原文地址:https://www.cnblogs.com/freeopen/p/5483034.html