给出一个长度为 n n n 的序列 a a a,选出其中连续且非空的一段使得这段和最大。
第一行是一个整数,表示序列的长度 n n n。
第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i i 个数字 a i a_i ai。
输出一行一个整数表示答案。
7
2 -4 3 -1 2 -4 3
4
选取 [ 3 , 5 ] [3, 5] [3,5] 子段 { 3 , − 1 , 2 } \{3, -1, 2\} {3,−1,2},其和为 4 4 4。
#include
using namespace std;
#define MAX 100010
//无穷小
#define INF LLONG_MIN
long long int a[MAX];
int main() {
int n;
cin >> n; // 读取数组的长度
for (int i = 0; i < n; i++) {
cin >> a[i]; // 读取数组的元素
}
long long int maxsum = a[0]; //当前子数组的最大和为数组的第一个元素
long long int ans = a[0]; //全局最大和为数组的第一个元素
for (int i = 1; i < n; i++) {
//如果当前元素比当前子数组和大,则从当前元素开始新的子数组和
maxsum = max(a[i], maxsum + a[i]); //更新当前子数组的最大和
if (maxsum > ans) {
ans = maxsum; // 如果当前子数组的最大和大于全局最大和,则更新全局最大和
}
}
cout << ans; // 输出全局最大和
return 0;
}
该题我使用了动态规划思想,动态的求出每个子区间的和,对比得出最大的区间和
本文章为平时做题笔记,有什么技术性问题都可以在评论区打出来,我都会认真查看并尽力解答大家的疑问。欢迎大佬来提出修改意见,感谢大家的关注和支持!