📌  相关文章
📜  用于最大总和连续子数组的C C++程序(1)

📅  最后修改于: 2023-12-03 15:27:11.405000             🧑  作者: Mango

用于最大总和连续子数组的C/C++程序

在算法中,最大总和连续子数组问题是一个经典的问题,它是指在给定的整数数组中,找到一个连续的子数组,使得子数组中所有元素的和最大。

对于这个问题,我们可以使用动态规划算法来解决。我们定义一个变量max_so_far,用于存储到当前元素为止子数组的最大和,同时再定义一个变量max_ending_here,用于存储子数组以当前元素为结尾的最大和。在遍历数组时,如果max_ending_here加上当前元素的和小于0,说明当前元素对后面的子数组产生了负面影响,我们可以将max_ending_here设为0,重新开始累加。否则,每次都可以更新max_ending_here的值,并将它与max_so_far比较,更新它们两者的值。当遍历完整个数组后,max_so_far就是我们所需的答案。

下面是C++代码实现:

int maxSubArraySum(int arr[], int n) {
  int max_so_far = INT_MIN, max_ending_here = 0;
  for (int i = 0; i < n; i++) {
    max_ending_here += arr[i];
    if (max_ending_here < 0) {
      max_ending_here = 0;
    } else if (max_ending_here > max_so_far) {
      max_so_far = max_ending_here;
    }
  }
  return max_so_far;
}

下面是C代码实现:

int maxSubArraySum(int arr[], int n) {
  int max_so_far = INT_MIN, max_ending_here = 0;
  for (int i = 0; i < n; i++) {
    max_ending_here += arr[i];
    if (max_ending_here < 0) {
      max_ending_here = 0;
    } else if (max_ending_here > max_so_far) {
      max_so_far = max_ending_here;
    }
  }
  return max_so_far;
}

接下来,我们可以使用以下测试用例验证我们的程序:

int main() {
  int arr[] = {-2, -3, 4, -1, -2, 1, 5, -3};
  int n = sizeof(arr) / sizeof(arr[0]);
  int max_sum = maxSubArraySum(arr, n);
  printf("最大总和连续子数组的和为:%d", max_sum);
  return 0;
}

输出结果应该是最大总和连续子数组的和为:7

这就是用于最大总和连续子数组的C/C++程序。