给定由n个数组成的序列a1,a2,……,an,序列中可能有负数,要在这n个数中选取相邻的一段ai, ai+1,……,aj(1≤i≤j≤n)使其和最大,并输出最大和,并输出最大和的子段的起止位置。当所有的数均为负数时,定义最大子段和为0。其中数据个数n和n个数据都通过键盘输入,要求使用动态规划算法实现。用C语言实现
时间: 2024-03-16 12:47:04 浏览: 87
好的,下面是用C语言实现最大子段和问题的代码:
```c
#include <stdio.h>
int main() {
int n, i, maxSum, thisSum, start, end, thisStart;
int a[1000];
// 输入数据
printf("请输入数据个数n:");
scanf("%d", &n);
printf("请输入%d个数:", n);
for (i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
// 动态规划求解
maxSum = thisSum = a[1];
start = end = thisStart = 1;
for (i = 2; i <= n; i++) {
if (thisSum > 0) {
thisSum += a[i];
} else {
thisSum = a[i];
thisStart = i;
}
if (thisSum > maxSum) {
maxSum = thisSum;
start = thisStart;
end = i;
}
}
// 输出结果
printf("最大子段和为:%d\n", maxSum);
printf("最大子段的起止位置为:%d ~ %d\n", start, end);
return 0;
}
```
该程序首先读入数据个数n和n个数,然后使用动态规划求解最大子段和问题,最后输出最大子段和及其对应的子段的起止位置。
阅读全文