输入若干个整数,有正有负, 并且头尾相接组成一个环。求最大子段和。注意子段为一段连续的数。
【输入格式】
第 1 行为 𝑁,代表组成环的 𝑁 个数。
第 2 行有 𝑁 个数,第 𝑖 个整数为 𝐴𝑖,每两个整数之间用一个空格隔开。
【输出格式】
输出共一行一个整数,即最大子段和。
【输入样例】
8 -
2 10 8 -4 7 5 -29 10
【输出样例】
34
【数据规模】
对于 30%的数据: 1 ≤ 𝑁 ≤ 10。
对于 60%的数据: 1 ≤ 𝑁 ≤ 100。
对于 100%的数据: 1 ≤ 𝑁 ≤ 1000; |𝐴𝑖| ≤ 1000。
这个题我如果没有理解错,答案不应该是38吗?如果没理解错,下面是我的想法的代码
/*O(n)*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1100;
int a[N];
int dp[N];
int bg[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int maxx=-1e7;
#先计算不成环时,dp表示前i个数,如果把a[i]加上最大的字段和,bg[i]表示前i个数字中,有i的最大字段和的第一个数字
for(int i=1;i<=n;i++)
{
if(dp[i-1]>0)
{
dp[i]=dp[i-1]+a[i];
bg[i]=bg[i-1];
}
else
{
dp[i]=a[i];
bg[i]=i;
}
if(dp[i]>maxx)
{
maxx=dp[i];
}
}
#然后计算成环后,如果成环形成最大字段和,那么成环的后半部分肯定是以1为开始的最大字段和
if(dp[n]>0)
{
for(int i=1;i<bg[n];i++)
{
if(bg[i]!=1)
{
break;
}
dp[i]=dp[i]+dp[n];
if(maxx<dp[i])
maxx=dp[i];
}
}
cout<<maxx;
return 0;
}
```c++
```
【以下回答由 GPT 生成】
这个问题可以使用动态规划来解决。
解决方案如下: 1. 首先,读取输入的n和n个整数,并将整数存储在一个列表中。
n = int(input())
numbers = list(map(int, input().split()))
dp = [0] * n
dp[0] = numbers[0]
for i in range(1, n):
dp[i] = max(numbers[i], dp[i-1] + numbers[i])
min_sum = numbers[0]
for i in range(1, n):
if dp[i-1] < 0:
min_sum = min(min_sum, dp[i-1])
max_sum = max(dp)
total_sum = sum(numbers)
result = max(max_sum, total_sum - min_sum)
print(result)
解决方案的时间复杂度为O(n),空间复杂度为O(n)。
【相关推荐】