用c++代码解决问题【问题描述】使用动态规划算法解最大子段和问题,具体来说就是,依据递归式,按照顺序求得子问题。 【输入形式】在屏幕上输入一个序列元素,包含负整数、0和正整数。 【输出形式】序列的最大子段和,和最大子段 【样例输入】 -2 11 -4 13 -5 -2 【样例输出】 20 11 -4 13
时间: 2024-02-12 19:04:58 浏览: 110
算法设计与分析--求最大子段和问题(蛮力法、分治法、动态规划法) C++实现.rar
5星 · 资源好评率100%
好的,下面是使用动态规划算法解决最大子段和问题的 C++ 代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums; // 存储输入序列
int num;
while (cin >> num) {
nums.push_back(num);
}
int max_sum = nums[0]; // 记录当前最大子段和
int cur_sum = nums[0]; // 记录当前子段和的起点
int max_start = 0; // 记录最大子段的起点
int max_end = 0; // 记录最大子段的终点
int cur_start = 0; // 记录当前子段的起点
for (int i = 1; i < nums.size(); i++) {
if (cur_sum < 0) {
cur_sum = nums[i];
cur_start = i;
} else {
cur_sum += nums[i];
}
if (cur_sum > max_sum) {
max_sum = cur_sum;
max_start = cur_start;
max_end = i;
}
}
cout << max_sum << " ";
for (int i = max_start; i <= max_end; i++) {
cout << nums[i] << " ";
}
cout << endl;
return 0;
}
```
输入序列时,我们将每个数存储在一个 vector 容器中。然后,我们定义一些变量来记录当前子段和的起点、最大子段和、最大子段的起点和终点等信息。接下来,我们从第二个数开始遍历序列,对于每个数,我们判断当前子段和是否小于 0。如果小于 0,则从当前数重新开始计算子段和;否则,将当前数加入子段中。同时,我们判断当前子段和是否大于最大子段和,如果是,则更新最大子段和以及最大子段的起点和终点。
最后,我们输出最大子段和以及对应的最大子段。
阅读全文