中国大学MOOC-陈越、何钦铭-数据结构-2023夏季
题目集
题目
思路
令f(n)表示以第n个数结尾的连续序列的最大和,则状态转移方程为:
解释:如果f(n-1)小于零,代表对f(n)的值贡献为负。故,以为结尾的最大子列和就是,如果连上前面的就还会再小。有人问怎么办,那会在计算f(n+1)
在while循环中依次计算f(1), f(2), ... f(K),用变量ans存最大值,不断更新ans
具体来说,用current存以当前数ai结尾的最大子列和,如果发现current小于零,那么立即将current清零。
code
# include <iostream>
# include <algorithm>
int main(void)
{
long long ans = 0;
long long current = 0;
int K;
std::cin >> K;
while (K--)
{
long long tmp;
std::cin >> tmp;
current += tmp;
if (current < 0) current = 0;
ans = std::max(ans, current);
}
std::cout << ans << std::endl;
return 0;
}