1. Kadane算法:从一维到二维的动态规划实践
Kadane算法是解决最大子数组和问题的经典动态规划算法,由卡内基梅隆大学的教授Jay Kadane在1984年提出。这个看似简单的问题在实际应用中却有着广泛的价值,从基因组序列分析到金融数据分析,再到计算机视觉中的图像处理,都能看到它的身影。
1.1 一维Kadane算法核心思想
一维Kadane算法解决的是在一个整数数组中寻找连续子数组,使其和最大的问题。它的精妙之处在于将时间复杂度从暴力解法的O(n²)降低到了O(n),同时空间复杂度仅为O(1)。
算法的核心状态转移逻辑基于一个简单的观察:以当前元素结尾的最大子数组和,要么是当前元素本身,要么是当前元素加上以前一个元素结尾的最大子数组和。用数学表达式表示就是:
code复制dp[i] = max(A[i], dp[i-1] + A[i])
其中dp[i]表示以第i个元素结尾的最大子数组和。在实际编码中,我们可以用一个变量current_sum来滚动更新这个值,而不需要维护整个dp数组。
注意:处理全负数数组时,最大子数组和就是数组中的最大单个元素值。这是Kadane算法需要特别注意的边界情况。
1.2 一维Kadane算法实现细节
让我们深入分析提供的C++实现代码中的关键点:
cpp复制long long max_num = LLONG_MIN;
long long current_window_sum = 0;
for (int i = 0; i < n; i++) {
int val;
cin >> val;
current_window_sum += val;
if (current_window_sum > max_num) {
max_num = current_window_sum;
}
if (current_window_sum < 0) {
current_window_sum = 0;
}
}
这段代码有几个值得注意的优化点:
- 使用
LLONG_MIN初始化最大值,确保能正确处理全负数数组 - 在更新
current_window_sum后立
