leetcode算法题--K 次串联后最大子数组之和★

原题链接:https://leetcode-cn.com/problems/k-concatenation-maximum-sum/

如图(盗图)
leetcode算法题--K 次串联后最大子数组之和★_第1张图片
记k==1,数组和为sum

分情况讨论:

  • 当k == 1,对应第一种情况,输出最大子数组之和max_sub
  • 当k == 2,对应第二种情况,输出max(最大后缀和+最大前缀和,max_sub)
  • 当k > 2,对应第三种情况,这里又有两种情况:①当sum为非负,则输出最大后缀和+中间和+最大前缀和;②当sum为负,max(最大后缀和+最大前缀和,max_sub)
int kConcatenationMaxSum(vector<int>& arr, int k) {
	long mod=1000000007;
	long size=arr.size();
	long max_pro=0;//最大后缀和
	long min_pro=0;//最小后缀和,sum-min_pro则为最大前缀和
	int max_sub=INT_MIN;//最大子数组和
	vector<long> pro(size+1,0);
	vector<int> dp(size+1,0);
	for(int i=size-1;i>=0;i--){
	    dp[i]=max(dp[i+1]+arr[i],0);
	    max_sub=max(max_sub,dp[i]);//求最大子数组和
	    pro[i]=pro[i+1]+arr[i];
	    max_pro=max(max_pro,pro[i]);//求最大后缀和
	    min_pro=min(min_pro,pro[i]);//求最小后缀和
	}
	long sum=accumulate(arr.begin(),arr.end(),0)%mod;//数组和
	if(k==1){
	    return max_sub;
	}
	else {
	    return max((long)max_sub,max(sum,(long)0)*(k-2)+max_pro+sum-min_pro)%mod;//通过max(sum,0)*(k-2)将后面几种情况一起处理
	}
}

你可能感兴趣的:(算法)