【发布时间】:2012-10-22 18:18:29
【问题描述】:
子数组包含正数和负数。你必须找到一个最大和子数组,使得子数组的长度大于或等于k。
这是我使用 Kadane 算法的 c++ 代码。
#include <iostream>
using namespace std;
int main(){
int n,k;
cin >> n >> k;
int array[n];
int sum = 0;
int maxsum = 0;
int beststarts[n];
for(int i = 0;i < n; i++){
cin >> array[i];
}
for(int i = 0;i < k-1;i ++){
sum = sum+array[i];
beststarts[i] = 0;
}
for(int i = k-1;i < n; i++){ //best end search with min length;
sum = sum+array[i];
int testsum = sum;
if(i > 0){
beststarts[i] = beststarts[i-1];
}
for(int j = beststarts[i] ;i-j > k-1;j ++){
testsum = testsum - array[j];
if(testsum > sum){
beststarts[i] = j+1;
sum = testsum;
}
}
if(sum > maxsum){
maxsum = sum;
}
}
cout << maxsum;
return 0;
}
我的代码运行良好,但速度很慢,我想不出任何方法来改进我的代码。我也读过这个问题Find longest subarray whose sum divisible by K 但这不是我想要的,长度也可以大于k。
【问题讨论】:
-
作为旁注。这不是有效的 C++。 C++ 不允许声明具有非常量值的数组。这是一些 C++ 编译器选择支持的 C99 标准。 (见stackoverflow.com/q/737240/416574)
-
@pstrjds 我知道,但我的编译器 (Gcc) 支持它,所以为什么不使用它!
-
我并不是说不要使用它 :) 我只是想指出它以防其他人看到它并对他们的编译器感到沮丧,因为它无法编译。
-
Subset Sum algorithm的可能重复
标签: c++ algorithm dynamic-programming kadanes-algorithm