题目:
代码:
class Solution {
public:
int kConcatenationMaxSum(vector<int>& arr, int k) {
int mod=1e9+7,n=arr.size();
int qz=0,hz=0,zj=0;
int temp1=0,temp2=0;
int qzmin=0;
int sum=0;
for(int i=0;i<arr.size();i++){
sum+=arr[i];
if(qzmin>sum) qzmin=sum;
else{
zj=max(zj,sum-qzmin);
}
temp1+=arr[i];
if(temp1>qz) qz=temp1;
temp2+=arr[n-1-i];
if(temp2>hz) hz=temp2;
}
if(k==1) return zj;
if(sum<=0){
return max(zj,qz+hz);
}
long int a=1;
a*=(k-2);
a*=sum;
a=a%mod;
return max(zj,(qz+hz+(int)a)%mod);
}
};
思路:
1.先求出最大前缀qz,最大后缀hz,以及最大子数组zj,整个数组的和sum
2.分三种情况:
一、k=1,则应为原数组的最大子数组
二、k>=2,sum<=0,则应为max(zj,qz+hz),即最多只能包含两个数组
三、k>=2,sum>0,则应为max(zj,qz+hz+(k-2)*sum),即要么是原数组的最大子数组,要么是第一个数组的最大后缀加中间所有数组加最后一个数组的盾最大前缀。