P1115 最大子段和C语言
时间: 2025-02-08 16:11:36 浏览: 53
### C语言实现最大子段和算法
#### 穷举法
穷举法通过遍历数组中所有的连续子序列并计算其和来找到最大子段和。这种方法的时间复杂度较高,为O(n^2),适用于较小规模的数据集。
```c
#include <stdio.h>
#define MAX 1000
int main() {
int nums[MAX];
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
printf("Enter %d integers:\n", n);
for (int i = 0; i < n; ++i) {
scanf("%d", &nums[i]);
}
int max_sum = nums[0];
for (int i = 0; i < n; ++i) {
int this_sum = 0;
for (int j = i; j < n; ++j) {
this_sum += nums[j];
if (this_sum > max_sum) {
max_sum = this_sum;
}
}
}
printf("Maximum subarray sum is %d\n", max_sum);
return 0;
}
```
此方法简单直观,但效率较低[^1]。
#### 动态规划法
动态规划是一种更高效的解决方案,时间复杂度降到了O(n)。该算法利用了一个重要的观察:如果已知到目前为止的最佳解,则可以基于它快速更新下一个最佳解。
```c
#include <stdio.h>
// 定义辅助函数用于返回两个整数之间的较大者
int max(int a, int b) {
return (a >= b) ? a : b;
}
int maxSubArray(int* nums, int numsSize){
int dp[numsSize]; // 创建一个dp表用来保存以第i个元素结束的最大子列和
dp[0] = nums[0]; // 初始化第一个元素
int maxx = nums[0]; // 记录全局最优解
for(int i = 1; i < numsSize; i++) {
dp[i] = max(dp[i-1]+nums[i], nums[i]); // 更新dp表
if(maxx < dp[i])
maxx = dp[i]; // 更新全局最优解
}
return maxx;
}
int main(){
int array[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int size = sizeof(array)/sizeof(array[0]);
printf("The maximum sub-array sum is %d.\n", maxSubArray(array, size));
return 0;
}
```
上述代码实现了动态规划版本的最大子段和求解过程,其中`max()`是一个简单的比较器函数,而`maxSubArray()`则是核心逻辑所在[^3].
阅读全文
相关推荐
















