洛谷 P1115 最大子段和
创始人
2024-05-29 18:39:31

题目链接:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

输入格式

第一行是一个整数,表示序列的长度 n。

第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai。

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

7
2 -4 3 -1 2 -4 3

样例输出 #1

4

提示

样例 1 解释

选取 [3, 5] 子段 {3, -1, 2},其和为 4。

数据规模与约定

  • 对于 40% 的数据,保证 n ≤ 2 × 10^3。
  • 对于 100% 的数据,保证 1 ≤ n ≤ 2 × 10^5,−10^4 ≤ ai ≤ 10^4。

AC code 1:(动态规划,线性dp)——使用dp数组存放每一个状态

#include
#include
#includeusing namespace std;int main()
{int n;cin>>n;vector a(n);for(int i = 0 ; i < n ; i ++)cin>>a[i];vector dp(n); // dp[i] 表示以下标 i 结尾的最大字段和dp[0] = a[0];int res = dp[0];for(int i = 1 ; i < n ; i ++){dp[i] = max(dp[i - 1] + a[i] , a[i]);res = max(res , dp[i]);}cout<

AC code 2: (发现每次只需要使用上一个状态(dp[i - 1]),因此可以直接使用一个变量保存上一个状态即可,减少额外的空间开销)

#include
#include
#includeusing namespace std;int main()
{int n;cin>>n;vector a(n);for(int i = 0 ; i < n ; i ++)cin>>a[i];int temp = a[0];int res = temp;for(int i = 1 ; i < n ; i ++){temp = max(temp + a[i] , a[i]);res = max(res , temp);}cout<

当然,这题也可以使用更为精妙的“分治”思想求解。

相关内容

热门资讯

撕开0蔗糖营销假象:代糖套路暗... 来源:金综科技当下健康消费热潮中,各类饮品、酸奶主打“0蔗糖”卖点,深受减脂、控糖人群青睐。但多数商...
中央第七生态环境保护督察组交办... 本报乌鲁木齐讯(全媒体记者 张贝) 2026年6月10日,中央第七生态环境保护督察组向兵团交办第...
自治区推动爱国卫生工作由环境卫... 本报乌鲁木齐讯(全媒体记者 郑娅莉) 今年5月1日,新修订的《新疆维吾尔自治区爱国卫生工作条例》...
知名车企停产三款国产电车!知情... (来源:车联新生态)据多家媒体报道,宝马将于今年7月起全面停产i3、i5、iX1三款国产纯电车型。针...
哪款好智能手表排行榜 中老年家... 清晨量血压前顺手抬腕查看昨夜深睡时长,服药提醒在表盘轻震浮现,散步途中血氧饱和度实时波动曲线悄然生成...