给定 n 天每天的收益(可正可负),需要从中选取一段连续天数,使这段连续收益之和最大,并输出这个最大收益。
这是典型的 最大子数组和 问题,可用 动态规划算法:
用 cur 表示“以当前天结尾的最大连续收益”
转移:cur = max(a[i], cur + a[i])
用 best 记录全局最大值:best = max(best, cur)
若 n=0(没有数据),最大收益记为 0
import sys
# 计算最大连续子数组和(最大连续收益)
def max_profit(arr):
if not arr:
return 0
cur = arr[0] # 以当前元素结尾的最大和
best = arr[0] # 全局最大和
for i in range(1, len(arr)):
x = arr[i]
# 关键:要么从当前天重新开始,要么接在前面连续段后面
cur = x if cur + x < x else cur + x
if cur > best:
best = cur
return best
def main():
data = sys.stdin.read().strip().split()
if not data:
return
n = int(data[0])
arr = []
for i in range(n):
arr.append(int(data[1 + i]))
print(max_profit(arr))
if __name__ == "__main__":
main()
#include <iostream>
#include <vector>
using namespace std;
// 计算最大连续子数组和(最大连续收益)
long long maxProfit(const vector<long long>& a) {
if (a.empty()) return 0;
long long cur = a[0]; // 以当前天结尾的最大和
long long best = a[0]; // 全局最大和
for (int i = 1; i < (int)a.size(); i++) {
long long x = a[i];
// 关键:要么从当前天重新开始,要么接到前面连续段后面
cur = max(x, cur + x);
best = max(best, cur);
}
return best;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cout << maxProfit(a) << "\n";
return 0;
}
import java.util.Scanner;
public class Main {
// 计算最大连续子数组和(最大连续收益)
public static long maxProfit(long[] a) {
if (a.length == 0) return 0;
long cur = a[0]; // 以当前天结尾的最大和
long best = a[0]; // 全局最大和
for (int i = 1; i < a.length; i++) {
long x = a[i];
// 关键:要么从当前天重新开始,要么接到前面连续段后面
cur = Math.max(x, cur + x);
best = Math.max(best, cur);
}
return best;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextLong();
}
System.out.println(maxProfit(a));
sc.close();
}
}
团团过年收获了很多压岁钱,妈妈帮他开了账户去投资。现在给出 n 天内投资收益情况,选出划中连续多少天的收益总和量大,这个收益是多少。
第一行是一个整数 n ,表示天数,n 的范围为 [0,1000]
第二行是 n 整数组成的一个数组,表示每天的收益,有正数也有负数,范围为 [−10000,100000]
输出一个整数,表示选取的连续天数的收益
输入
3
1 0 -1
输出
1
说明
3 天的收益,第一天最多,输出为 1
输入
7
2 -4 3 -1 2 -4 3
输出
4
说明
7 表示 7 天的收益,选取第 3 天到第 5 天的收益最大,3−1+2=4