東京大学 新領域創成科学研究科 メディカル情報生命専攻 2018年8月実施 問題12
Author
Description
Let be a sequence of (possibly negative) integers. We wish to find and such that and maximize
As a first step, we calculate
(1) Write a formula for .
(2) Write a formula for in terms of .
(3) Write an algorithm that calculates the following value and outputs a pair satisfying the requirements:
The running time of your algorithm should be . Assume that operations on two integers take unit time: , .
设 为一个(可能为负数)的整数序列。我们希望找到 和 使得 并且使
最大化。
第一步,我们计算
(1) 写出 的公式。
(2) 写出 的公式。
(3) 写出一个算法计算以下值并输出满足要求的 对:
算法的运行时间应为 。假设对两个整数的操作需要单位时间:, 。
题目描述
给定可能含负数的整数序列 ,要求找到
使连续区间和
最大。先定义以位置 结尾的最佳非空连续区间和
- 写出 。
- 用 与 写出 的递推式。
- 设计一个在 时间内计算
且输出一对达到最大值的端点 的算法。假设两个整数的加法与取最大值均耗费单位时间。
考点
- 最大子数组和动态规划:在“从当前位置重新开始”和“延长前一最佳后缀”之间取优,建立 Kadane 型递推。
- 最优区间恢复:在线性扫描中同步维护当前候选左端点、全局最佳值及其左右端点,包含全负数情形。
Kai
(1)
The formula for is simply the first element of the sequence since it represents the maximum subarray sum ending at the first position:
(2)
To derive from , consider the subarray ending at position . There are two possibilities: either the subarray includes only or it includes the subarray ending at extended by . Thus:
This formula captures the choice between starting a new subarray at or extending the previous subarray to include .
(3)
The algorithm calculates the maximum subarray sum and identifies the starting and ending indices of the subarray that achieves this sum. Here is the algorithm in Python:
def max_subarray_sum(sequence):
max_sum = current_sum = sequence[1]
start = end = temp_start = 1
for i in range(2, len(sequence) + 1):
if current_sum > 0:
current_sum += sequence[i]
else:
current_sum = sequence[i]
temp_start = i
if current_sum > max_sum:
max_sum = current_sum
start = temp_start
end = i
return start, end, max_sum
# Example usage
sequence = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
start, end, max_sum = max_subarray_sum(sequence)
print(f"Maximum subarray sum: {max_sum}")
print(f"Start index: {start}, End index: {end}")
Explanation
-
The algorithm initializes the variables
max_sum,current_sum,start,end, andtemp_startto keep track of the maximum subarray sum and its indices. -
It iterates through the sequence, updating the
current_sumbased on the formula . -
If the
current_sumis greater than themax_sum, it updates themax_sum,start, andendindices. -
The algorithm returns the
start,end, andmax_sumvalues.
Complexity Analysis
-
Time Complexity: The algorithm has a time complexity of since it iterates through the sequence once.
-
Space Complexity: The space complexity is since the algorithm uses a constant amount of space for variables.
Knowledge
动态规划 最大子序列和
难点思路
难点在于理解如何通过比较当前元素和当前子序列和来决定是否开始一个新的子序列或继续当前子序列。理解动态规划的状态转移方程 对于解题至关重要。
解题技巧和信息
- 动态规划是一种通过分解问题并利用子问题解的技巧。对于本问题,关键在于理解如何通过前一步的解来更新当前解。
- 对于最大子序列和问题,Kadane's Algorithm 是一个经典解法,其时间复杂度为 ,适合处理大规模数据。
重点词汇
- subarray 子数组
- maximum subarray sum 最大子数组和
- dynamic programming 动态规划
- sequence 序列
参考资料
- Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein, Chapter 4: Divide-and-Conquer (Maximum Subarray Problem)
- The Art of Computer Programming, Volume 3: Sorting and Searching by Donald E. Knuth, Section 5.3.2: Maximum Subarray Problem