最大子序和 —— C++ 动态规划 分治法

题目描述

给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

分治法代码:

#include<iostream>
using namespace std;

/*
9
-2 1 -3 4 -1 2 1 -5 4
*/
int MaxSum(int a[],int left,int right){
	int sum=0,midSum=0,leftSum=0,rightSum=0;
	int center,s1=0,s2=0,lefts=0,rights=0;
	if(left==right){
		sum=a[left];
	}else{
		center=(left+right)/2;
		leftSum=MaxSum(a,left,center);
		rightSum=MaxSum(a,center+1,right);
		for(int i=center;i>=left;--i){
			lefts+=a[i];
			if(lefts>s1){
				s1=lefts;
			}
		}
		for(int j=center+1;j<=right;++j){
			rights+=a[j];
			if(rights>s2){
				s2=rights;
			}
		}
		midSum=s1+s2;
		sum=midSum>leftSum?midSum:leftSum;
		sum=sum>rightSum?sum:rightSum;
	}
	return sum;
} 

int main(){
	int n;
	cin>>n;
	int a[n];
	for(int i=0;i<n;++i){
		cin>>a[i];
	}
	cout<<MaxSum(a,0,n-1);
	return 0;
} 

分治法运行截图:

在这里插入图片描述

动态规划代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i];
            maxSum = Math.max(maxSum, dp[i]);
        }
        return maxSum;
    }
}

动态规划leetcode提交记录:

在这里插入图片描述

leetcode地址:

https://leetcode-cn.com/problems/maximum-subarray/


版权声明:本文为weixin_45953673原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。