#include <stdio.h>
void max_subarray(int al[], int n) {
int max_ending_here, max_so_far;
int start_pos_x=0, start_pos, end_pos, i;
max_ending_here=al[0];
max_so_far=al[0];
for(i=1;i<n;i+=1) {
if(al[i]>max_ending_here+al[i]) {
start_pos_x=i;
max_ending_here=al[i];
} else {
max_ending_here=al[i]+max_ending_here;
}
if(max_so_far<max_ending_here) {
start_pos=start_pos_x;
end_pos=i;
max_so_far=max_ending_here;
}
}
printf("start_pos=%d end_pos=%d\n", start_pos,end_pos);
for(i=start_pos;i<end_pos+1;i+=1) {
printf("%d ", al[i]);
}
printf("sum=%d\n", max_so_far);
}
int main() {
int al[100]={0,};
int i=0, x;
while(1) {
scanf("%d", &x);
if(x==0) break;
al[i]=x;
i+=1;
}
max_subarray(al, i);
return 0;
}
============================================================
Maximum sum subarray problem
Ulf Grenander of Brown University in 1977
Linear time algorithm by Jay Kadane of Carnegie-Mellon University 1984
0이 입력될 때까지 정수(20개 이하)들을 입력 받아, 연속해서 입력된
임의의 개수의 정수들의 합이 최대가 되는 경우를 출력하는 프로그램을
작성하시오.
단 합이 최대가 되는 구간의 둘 이상인 경우에는 가장 처음에 나오는
구간을 출력하라.
예:
10 -5 -12 4 -13 11 7 -3 7 -10 5 0
==> 11 7 -3 7
10 -5 -12 4 -3 11 7 -3 7 -10 5 0
==> 4 -3 11 7 -3 7
1 1 -5 2 0
==> 1 1
-3 -1 0
==> -1
'c·c++ > c 프로그래밍' 카테고리의 다른 글
개미수열-보충과제 모음: (0) | 2020.02.10 |
---|---|
소인수 분해 코드 (0) | 2016.07.10 |
quick sort (0) | 2015.10.01 |
하노이탑 - 반복문사용 (0) | 2015.09.20 |
Microsoft Visual Studio 2010 Express Registration Key (0) | 2015.07.16 |