给定由n个数组成的序列a1,a2,……,an,序列中可能有负数,要在这n个数中选取相邻的一段ai, ai+1,……,aj(1≤i≤j≤n)使其和最大,并输出最大和,并输出最大和的子段的起止位置。当所有的数均为负数时,定义最大子段和为0。其中数据个数n和n个数据都通过键盘输入,要求使用动态规划算法实现。c++
时间: 2024-03-05 07:53:53 浏览: 113
好的,这是一个经典的最大子段和问题,可以使用动态规划算法解决。
C++代码如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int max_sum = 0;
int start = 0;
int end = 0;
int cur_sum = 0;
int cur_start = 0;
for (int i = 0; i < n; i++) {
cur_sum += nums[i];
if (cur_sum > max_sum) {
max_sum = cur_sum;
start = cur_start;
end = i;
}
if (cur_sum < 0) {
cur_sum = 0;
cur_start = i + 1;
}
}
cout << "最大子段和为:" << max_sum << endl;
cout << "最大子段起始位置为:" << start << endl;
cout << "最大子段终止位置为:" << end << endl;
return 0;
}
```
输入格式:第一行输入一个整数n,表示序列中数字的个数。第二行输入n个整数,表示序列中的数字。
输出格式:一行输出最大子段和,一行输出最大子段的起始位置,一行输出最大子段的终止位置。
例如,输入:
```
10
-1 2 3 -4 5 10 -5 2 8 -9
```
输出:
```
最大子段和为:18
最大子段起始位置为:1
最大子段终止位置为:8
```
阅读全文