software pj2

题目要求:

题目(1):

最大连续子数组和(最大子段和)

背景

问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n

例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

-- 引用自《百度百科》

代码

#pragma warning(disable:4996);

#include

#include

// 函数返回两个数中的较大值
int max(int a, int b) {
return (a > b) ? a : b;
}

// 计算最大连续子数组和
int maxSubArraySum(int arr[], int size) {
int ture_max = 0; // 最大连续子数组和初始化为0
int curr_max = 0; // 当前连续子数组和初始化为0

for (int i = 0; i < size; i++) {
    curr_max = max(arr[i], curr_max + arr[i]);
    ture_max = max(ture_max, curr_max);
}
return ture_max;

}

int main() {
int n;
printf("请输入整数代表输入数的个数:");
scanf("%d", &n);

int* arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
    printf("内存分配失败\n");
    return 1;
}

printf("请输入数据:");
for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
}

int max_sum = maxSubArraySum(arr, n);
printf("最大连续子数组和为 %d\n", max_sum);

// 释放动态分配的内存
free(arr);

return 0;

}

解题思路

解决最大连续子数组和问题的算法,采用了动态规划的思想。具体而言,它在遍历数组时维护两个变量:curr_max 用于记录当前连续子数组的和,

true_max 用于记录最大连续子数组的和。在每一步迭代中,curr_max 被更新为当前元素与之前连续子数组和加上当前元素的较大值,而 true_max

则被更新为 curr_max 和 true_max 中的较大值。最终,true_max 将包含整个数组的最大连续子数组和。用户需要提供整数来表示输入数组的长度,

然后逐个输入数组元素。程序会计算出输入数组的最大连续子数组和,并将结果打印出来。这个程序提供了一个简单的用户界面,使用户能够输入数据并

查看结果,从而解决了这个常见的数组问题。

posted @   xiaoxfeng  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示