📅  最后修改于: 2023-12-03 14:58:23.471000             🧑  作者: Mango
给定一个包含n个整数的序列a1,a2,…,an,你需要找到其中的一个连续子序列,使得其和最大。同时,你需要输出这个最大的子序列的和。例如,如果输入序列为 -2, 1, -3, 4, -1, 2, 1, -5, 4,则可以找到一个连续的子序列4,-1,2,1,该子序列的和为6。
第一行包含一个整数n。
第二行包含n个整数,表示整个序列。
-1,000,000≤ai≤1,000,000 1≤n≤10^5
8
-2 1 -3 4 -1 2 1 -5 4
6
设 $f[i]$ 表示以第 $i$ 个数结尾的所有子段和的最大值。
第 $i$ 个数只有两种选择:
加入以第 $i-1$ 个数结尾的子段,即 $f[i]=f[i-1]+a[i]$。
自己单独成段,即 $f[i]=a[i]$。
综上所述,状态转移方程为:$f[i] = \max(f[i-1]+a[i], a[i])$
对所有的 $f[i]$ 求出最大值就是答案。
n = int(input())
nums = list(map(int, input().split()))
max_sum = nums[0] # 初始化最大子序列和为第一个数
cur_sum = 0 # 以前缀i结尾的所有子段和的最大值
for i in range(n):
cur_sum = max(cur_sum+nums[i], nums[i]) # 状态转移方程
max_sum = max(max_sum, cur_sum)
print(max_sum)
Markdown返回结果:
# 门 | GATE IT 2006 | 问题25
## 题目描述
给定一个包含n个整数的序列a1,a2,…,an,你需要找到其中的一个连续子序列,使得其和最大。同时,你需要输出这个最大的子序列的和。例如,如果输入序列为 -2, 1, -3, 4, -1, 2, 1, -5, 4,则可以找到一个连续的子序列4,-1,2,1,该子序列的和为6。
## 输入格式
- 第一行包含一个整数n。
- 第二行包含n个整数,表示整个序列。
## 输出格式
- 输出一个整数,表示最大的子序列的和。
## 数据范围
-1,000,000≤ai≤1,000,000
1≤n≤10^5
## 示例
### 输入示例
8 -2 1 -3 4 -1 2 1 -5 4
### 输出示例
6
## 解题思路
### 1. 状态表示
设 $f[i]$ 表示以第 $i$ 个数结尾的所有子段和的最大值。
### 2. 状态转移
第 $i$ 个数只有两种选择:
- 加入以第 $i-1$ 个数结尾的子段,即 $f[i]=f[i-1]+a[i]$。
- 自己单独成段,即 $f[i]=a[i]$。
综上所述,状态转移方程为:$f[i] = \max(f[i-1]+a[i], a[i])$
### 3. 答案计算
对所有的 $f[i]$ 求出最大值就是答案。
## 代码实现
```python
n = int(input())
nums = list(map(int, input().split()))
max_sum = nums[0] # 初始化最大子序列和为第一个数
cur_sum = 0 # 以前缀i结尾的所有子段和的最大值
for i in range(n):
cur_sum = max(cur_sum+nums[i], nums[i]) # 状态转移方程
max_sum = max(max_sum, cur_sum)
print(max_sum)