You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C++最大子数组和代码得到的最大和为最后一个子数组的和

问题原因

你的代码存在两处核心逻辑错误,直接导致输出不符合预期:

  • 最大值变量被频繁重置:你把largestsum = INT_MIN写在了内层j循环的内部,每遍历一个以i为起点、j为终点的子数组,就会把之前记录的最大值清空为INT_MIN,之前所有子数组的最大值记录直接丢失。
  • 最大值比较逻辑位置错误:你把largestsum = max(largestsum, currentsum)写在了j循环结束之后,整个j循环运行过程中没有做任何最大值比对,只有当所有以i为起点的子数组都遍历完之后,才会用最后一个子数组的currentsum和被重置过的largestsum比较,最终输出的自然就是最后一个子数组的和。你给出的测试用例中,i=0时最后一个子数组[-5,5,6,-7,1]的和刚好是0,所以输出结果为0。

另外额外说明:C++标准不支持可变长度数组int ar[n],这属于部分编译器的扩展特性,如需跨编译器兼容建议替换为vector或者动态申请数组。


修正后代码

#include <bits/stdc++.h>
using namespace std;

void printpair(int ar[], int n)
{
    for (int i = 0; i < n; i++)
    {
        // 每个i作为起点的子数组最大值单独初始化
        int largestsum = INT_MIN, currentsum = 0;
        for (int j = i; j < n; j++)
        {
            currentsum = 0;
            for (int k = i; k <= j; k++)
            {
                cout << ar[k] << ",";
                currentsum += ar[k];
            }
            // 每生成一个子数组就同步更新最大值
            largestsum = max(largestsum, currentsum);
            cout << "\n";
        }
        cout << "the largest sum is " << largestsum << endl;
    }
}

int main()
{
    int n;
    cin >> n;
    int *ar = new int[n];
    for (int i = 0; i < n; i++)
        cin >> ar[i];
    printpair(ar, n);
    delete[] ar;
    return 0;
}

修正后针对你给出的测试用例,外层第一次循环输出的最大和为6,符合预期结果。


内容的提问来源于stack exchange,提问作者convoluxon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:15:01