查找具有最大总和的连续子数组
Finding the contiguous sub array with max sum
这是我的程序,用于从给定数组中查找子数组(连续)的最大总和。使用kadane的算法非常简单。
#include <iostream>
#include <cstdio>
using namespace std;
int kadane(int a[], int n) {
int max_ending_here = a[0], max_till_now = a[0];
int _start = 0, _end;
bool s=true;
for (int i = 1; i < n; ++i)
{
max_ending_here = max(a[i], max_ending_here + a[i]);
if(max_ending_here + a[i] > a[i] && s==false) _start = i, s=true;
max_till_now = max(max_ending_here, max_till_now);
if(max_ending_here + a[i] < a[i] && s==true) _end=i-1,s=false;
}
printf("S = %d , E = %d\n",_start,_end);
return max_till_now;
}
int main(int argc, char const *argv[])
{
//int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
int a[6] = {-8,-1,-1,-1,-1,-5};
int m = kadane(a, 6);
printf("%d\n",m);
return 0;
}
但我还想找到具有最大和的连续子数组的开始和结束位置。我尝试在上面的程序中添加几行来做到这一点,但它没有用。所以我的问题是如何获得具有最大总和的子数组的开始和结束位置?谢谢。
像这样扩展函数签名:
int kadane(int a[], int n, int *start, int *end)
在函数的最后,在return之前设置两个参数如下:
*start = _start;
*end = _end;
return max_till_now;
}
并这样称呼它:
int start, end;
int m = kadane(a, 6, &start, &end);
printf("sum: %i, start %i, end: %i\n",m, *start, *end);
尝试使用此代码作为基础来做你想做的事。忽略一些葡萄牙语(我的母语)的单词。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void seg_max(int *v, int n, int & x, int &y , int & max){
int i,j;
int soma;
max = -1;
for(i=0;i<n;i++){
soma = 0;
for(j=i;j<n;j++){
soma += v[j];
if( soma > max ){
max = soma;
x = i;
y = j;
}
}
}
}
int main(){
int x,y,max;
int v[] = {-2,1,-3,4,-1,2,1,-5,4};
seg_max(v,9,x,y,max);
printf("max sum [%d-%d] with the sum equal to %d\n", x,y,max);
}
要从函数中传递更多信息,请使用指针。以下应该有效。
#include <cstdio>
using namespace std;
int kadane(int a[], int n, int* start, int* end ) {
int max_ending_here = a[0], max_till_now = a[0];
bool s=true;
for (int i = 1; i < n; ++i)
{
max_ending_here = max(a[i], max_ending_here + a[i]);
if(max_ending_here + a[i] > a[i] && s==false) {
*start = i;
s=true;
}
max_till_now = max(max_ending_here, max_till_now);
if(max_ending_here + a[i] < a[i] && s==true) {
*end = i-1;
s = false;
}
}
return max_till_now;
}
int main(int argc, char const *argv[])
{
//int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
int a[6] = {-8,-1,-1,-1,-1,-5};
int start = 0, end = 0;
int m = kadane(a, 6, &start, &end);
printf("Max: %d, Start: %d, End: %d\n",m, start, end);
return 0;
}
这是我的程序,用于从给定数组中查找子数组(连续)的最大总和。使用kadane的算法非常简单。
#include <iostream>
#include <cstdio>
using namespace std;
int kadane(int a[], int n) {
int max_ending_here = a[0], max_till_now = a[0];
int _start = 0, _end;
bool s=true;
for (int i = 1; i < n; ++i)
{
max_ending_here = max(a[i], max_ending_here + a[i]);
if(max_ending_here + a[i] > a[i] && s==false) _start = i, s=true;
max_till_now = max(max_ending_here, max_till_now);
if(max_ending_here + a[i] < a[i] && s==true) _end=i-1,s=false;
}
printf("S = %d , E = %d\n",_start,_end);
return max_till_now;
}
int main(int argc, char const *argv[])
{
//int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
int a[6] = {-8,-1,-1,-1,-1,-5};
int m = kadane(a, 6);
printf("%d\n",m);
return 0;
}
但我还想找到具有最大和的连续子数组的开始和结束位置。我尝试在上面的程序中添加几行来做到这一点,但它没有用。所以我的问题是如何获得具有最大总和的子数组的开始和结束位置?谢谢。
像这样扩展函数签名:
int kadane(int a[], int n, int *start, int *end)
在函数的最后,在return之前设置两个参数如下:
*start = _start;
*end = _end;
return max_till_now;
}
并这样称呼它:
int start, end;
int m = kadane(a, 6, &start, &end);
printf("sum: %i, start %i, end: %i\n",m, *start, *end);
尝试使用此代码作为基础来做你想做的事。忽略一些葡萄牙语(我的母语)的单词。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void seg_max(int *v, int n, int & x, int &y , int & max){
int i,j;
int soma;
max = -1;
for(i=0;i<n;i++){
soma = 0;
for(j=i;j<n;j++){
soma += v[j];
if( soma > max ){
max = soma;
x = i;
y = j;
}
}
}
}
int main(){
int x,y,max;
int v[] = {-2,1,-3,4,-1,2,1,-5,4};
seg_max(v,9,x,y,max);
printf("max sum [%d-%d] with the sum equal to %d\n", x,y,max);
}
要从函数中传递更多信息,请使用指针。以下应该有效。
#include <cstdio>
using namespace std;
int kadane(int a[], int n, int* start, int* end ) {
int max_ending_here = a[0], max_till_now = a[0];
bool s=true;
for (int i = 1; i < n; ++i)
{
max_ending_here = max(a[i], max_ending_here + a[i]);
if(max_ending_here + a[i] > a[i] && s==false) {
*start = i;
s=true;
}
max_till_now = max(max_ending_here, max_till_now);
if(max_ending_here + a[i] < a[i] && s==true) {
*end = i-1;
s = false;
}
}
return max_till_now;
}
int main(int argc, char const *argv[])
{
//int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
int a[6] = {-8,-1,-1,-1,-1,-5};
int start = 0, end = 0;
int m = kadane(a, 6, &start, &end);
printf("Max: %d, Start: %d, End: %d\n",m, start, end);
return 0;
}