10
-10 1 2 3 4 -5 -23 3 7 -21
1.代码一
#include<stdio.h>
#define MaxSize 10000
#define INF 0x3f3f3f3f
void MaxSubseqSum1(int A[], int N){
int ThisSum, MaxSum = -INF;
int flag=0,i, j, k;
int first, last;
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
}
if(flag==0){
printf("0 %d %d", A[0], A[N-1]);
return;
}
for(i=0; i<N; i++){
for(j=i; j<N; j++){
ThisSum = 0;
for(k=i; k<=j; k++)
ThisSum += A[k];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = i;
last = j;
}
}
}
//return MaxSum;
printf("%d %d %d", MaxSum, first, last);
}
void MaxSubseqSum2(int A[], int N){
int ThisSum, MaxSum = -INF;
int flag=0,i, j;
int first, last;
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
}
if(flag==0){
printf("0 %d %d", A[0], A[N-1]);
return;
}
for(i=0; i<N; i++){
ThisSum = 0;
for(j=i; j<N; j++){
ThisSum += A[j];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = i;
last = j;
}
}
}
printf("%d %d %d", MaxSum, first, last);
}
int main(){
int i, N;
int A[MaxSize];
scanf("%d", &N);
for(i=0; i<N; i++)
scanf("%d", &A[i]);
MaxSubseqSum2(A, N);
return 0;
}
- 修改一:
题目要求输出的是最大子列的其实元素和末尾元素, 而不是其实元素的位置和末尾元素的位置
printf("%d %d %d", MaxSum, A[first], A[last]);
// printf("%d %d %d", MaxSum, first, last);
2.修改二:注意全是负数和0的情况
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
if(A[i]==0){
flag=-1;
}
}
修改后的最终代码
#include<stdio.h>
#define MaxSize 10000
#define INF 0x3f3f3f3f
void MaxSubseqSum1(int A[], int N){
int ThisSum, MaxSum = -INF;
int flag=0,i, j, k;
int first, last;
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
}
if(flag==0){
printf("0 %d %d", A[0], A[N-1]);
return;
}
for(i=0; i<N; i++){
for(j=i; j<N; j++){
ThisSum = 0;
for(k=i; k<=j; k++)
ThisSum += A[k];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = i;
last = j;
}
}
}
//return MaxSum;
printf("%d %d %d", MaxSum, first, last);
}
void MaxSubseqSum2(int A[], int N){
int ThisSum, MaxSum = -INF;
int flag=0,i, j;
int first, last;
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
if(A[i]==0){
flag=-1;
}
}
if(flag==0){
printf("0 %d %d", A[0], A[N-1]);
return;
}
for(i=0; i<N; i++){
ThisSum = 0;
for(j=i; j<N; j++){
ThisSum += A[j];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = i;
last = j;
}
}
}
printf("%d %d %d", MaxSum, A[first], A[last]);
}
int main(){
int i, N;
int A[MaxSize];
scanf("%d", &N);
for(i=0; i<N; i++)
scanf("%d", &A[i]);
MaxSubseqSum2(A, N);
return 0;
}
代码二
#include<stdio.h>
#define MaxSize 10000
#define INF 0x3f3f3f3f
void MaxSubseqSum1(int A[], int N){
int ThisSum, MaxSum = -INF;
int flag=0,i, j, k;
int first, last;
for(i=0; i<N; i++){
if(A[i]>0){
flag = 1;
break;
}
}
if(flag==0){
printf("0 %d %d", A[0], A[N-1]);
return;
}
for(i=0; i<N; i++){
for(j=i; j<N; j++){
ThisSum = 0;
for(k=i; k<=j; k++)
ThisSum += A[k];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = i;
last = j;
}
}
}
//return MaxSum;
printf("%d %d %d", MaxSum, first, last);
}
void MaxSubseqSum2(int A[], int N){
int ThisSum=0, MaxSum = -INF;
int i;
int temp=0, first=0, last=0;
for(i=0; i<N; i++){
ThisSum += A[i];
if(ThisSum < 0){ //ThisSum<0表示 A[i]<0
ThisSum = 0;
temp = i + 1;
}
else if(ThisSum > MaxSum){
MaxSum = ThisSum;
first = temp;
last = i;
}
}
if(MaxSum < 0)
printf("0 %d %d", A[0], A[N-1]);
else
printf("%d %d %d", MaxSum, A[first], A[last]);
}
int main(){
int i, N;
int A[MaxSize];
scanf("%d", &N);
for(i=0; i<N; i++)
scanf("%d", &A[i]);
MaxSubseqSum2(A, N);
return 0;
}