dp动态规划,环形队列

输入若干个整数,有正有负, 并且头尾相接组成一个环。求最大子段和。注意子段为一段连续的数。
【输入格式】
第 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()))
  1. 定义一个长度为n的列表dp,用于存储子段和的最大值。
dp = [0] * n
  1. 利用动态规划的思想逐个计算子段和的最大值。对于每个位置i,我们有两个选择:
  2. 选择当前元素作为子段的起始元素,即以numbers[i]开始新的子段。
  3. 将当前元素添加到上一个子段的末尾,即将numbers[i]添加到上一个子段的后面。
dp[0] = numbers[0]
for i in range(1, n):
    dp[i] = max(numbers[i], dp[i-1] + numbers[i])
  1. 至此,dp列表中的最大值就是整个环中连续子段的和的最大值。但是这里有一个问题,由于环的首尾相接,所以最大值可能出现在两个端点之间的子段中。因此,我们还需要找到环中连续子段的和的最小值。
min_sum = numbers[0]
for i in range(1, n):
    if dp[i-1] < 0:
        min_sum = min(min_sum, dp[i-1])
  1. 最后,我们将整个环的连续子段的和的最大值与最小值相加,得到最终的结果。
max_sum = max(dp)
total_sum = sum(numbers)
result = max(max_sum, total_sum - min_sum)
print(result)

解决方案的时间复杂度为O(n),空间复杂度为O(n)。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^