📜  门| GATE IT 2006 |问题25(1)

📅  最后修改于: 2023-12-03 14:58:23.471000             🧑  作者: Mango

门 | 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]$ 求出最大值就是答案。

代码实现
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)