#include<bits/stdc++.h>
using namespace std;
int a[50010] = {0};
int count_num = 0; // 记录递归次数
int sum = 0;
int maxSub(int l, int r)
{
count_num++; // 统计递归次数
if (l == r){ // 递归出口
if (a[l] > 0){
sum = a[l];
}
else{ // 负串记0
sum = 0;
}
}
else{
int mid = (l+r)/2;
int l_res = maxSub(l, mid); // 左半部分最大子串
int r_res = maxSub(mid+1, r); // 右半部分最大子串
int s = 0;
// 横跨左右的最大子串
for (int i = l; i <= r; i++){
if (s+a[i] > 0){ // 正串更新
sum = max(sum, s=s+a[i]);
}
else{ // 负串记0
s = 0;
}
}
// 更新sum为最大子串长度
sum = max(sum, l_res);
sum = max(sum, r_res);
}
return sum;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
int res = maxSub(0, n-1);
printf("%d %d\n", res, count_num);
return 0;
}
另一种超短写法:
#include "bits/stdc++.h"
using namespace std;
int main()
{
int n,a,sum=0,ans=0,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a;
if(sum+a>0)
{
sum=sum+a;
ans=max(sum,ans);
}
else sum=0;
}
cout<<ans<<" "<<2*n-1;
return 0;
}