最大子段和(动态规划C++)
问题描述
给定由n个整数(可能为负整数)组成的序列a1, a2, …, an,求该序列形如
∑
k
=
i
j
a
k
\displaystyle\sum_{k=i}^{j} a_k
k=i∑jak的子段和的最大值。当所有整数均为负整数时定义其最大子段和为0。依此定义,所求的最优值为
\space\space\space\space\space
max
\max
max
{
\lbrace
{ 0,
max
1
≤
i
≤
j
≤
n
∑
k
=
i
j
a
k
\max_{1\leq i \leq j \leq n}\displaystyle\sum_{k=i}^{j} a_k
max1≤i≤j≤nk=i∑jak
}
\rbrace
}
例如,当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为
∑
k
=
2
4
a
k
\displaystyle\sum_{k=2}^{4} a_k
k=2∑4ak = 20。
举例说明
例如:
i | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
a[i] | -2 | 11 | -4 | 13 | -5 | -2 |
则其最大子段和为:11 + (-4) + 13 = 20
动态规划算法
设最大子段和为M
设1~i中包括a[i]的最大子段和为b[i]
则:
i | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
a[i] | -2 | 11 | -4 | 13 | -5 | -2 |
b[i] | -2 | 11 | 7 | 20 | 15 | 13 |
数组dp中的最大值就是所求的最大子段和M
即:
所以M = b[4] = 20,即最大子段和为20
C++代码实现
#include <iostream>
using namespace std;
//求最大子段和算法
int MaxSum(int *a,int n) {
int sum = 0, b = 0;
for (int i = 1; i <= n; i++) {
if (b > 0) {
b += a[i];
} else {
b = a[i];
}
if (b > sum) {
sum = b;
}
}
return sum;
}
int main() {
int a[100], n;
cout << "请输入元素个数:";
cin >> n;
cout << "请输入各个元素:";
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cout << endl << "序列(";
for (int i = 1; i <= n; i++) {
if (i == n) {
cout << a[i] << ")";
} else {
cout << a[i] << ",";
}
}
cout << "的最大子段和为:" << MaxSum(a, n) << endl;
return 0;
}
最后
最近发现一个在C++中引用很广泛的一个头文件
#include <bits/stdc++.h>
#include<bits/stdc++.h>包含C++的所有头文件
标准C++
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <cctype> //字符处理
#include <cerrno> //定义错误码
#include <cfloat> //浮点数处理
#include <ciso646> //对应各种运算符的宏
#include <climits> //定义各种数据类型最值的常量
#include <clocale> //定义本地化函数
#include <cmath> //定义数学函数
#include <complex> //复数类
#include <csignal> //信号机制支持
#include <csetjmp> //异常处理支持
#include <cstdarg> //不定参数列表支持
#include <cstddef> //常用常量
#include <cstdio> //定义输入/输出函数
#include <cstdlib> //定义杂项函数及内存分配函数
#include <cstring> //字符串处理
#include <ctime> //定义关于时间的函数
#include <cwchar> //宽字符处理及输入/输出
#include <cwctype> //宽字符分类
#include <deque> //STL 双端队列容器
#include <exception> //异常处理类
#include <fstream> //文件输入/输出
#include <functional> //STL 定义运算函数(代替运算符)
#include <limits> //定义各种数据类型最值常量
#include <list> //STL 线性列表容器
#include <locale> //本地化特定信息
#include <map> //STL 映射容器
#include <memory> //STL通过分配器进行的内存分配
#include <new> //动态内存分配
#include <numeric> //STL常用的数字操作
#include <iomanip> //参数化输入/输出
#include <ios> //基本输入/输出支持
#include <iosfwd> //输入/输出系统使用的前置声明
#include <iostream> //数据流输入/输出
#include <istream> //基本输入流
#include <iterator> //STL迭代器
#include <ostream> //基本输出流
#include <queue> //STL 队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL 堆栈容器
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <typeinfo> //运行期间类型信息
#include <utility> //STL 通用模板类
#include <valarray> //对包含值的数组的操作
#include <vector> //STL 动态数组容器
都看到这里了,随手点个赞吧 ~(^ - ^)~