// 1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> typedef struct pair { int* C; int* B; int max; }pair; //最大连续子数组的和 pair sum(int* A,int n) { int* B = (int*)malloc(sizeof(int)*(n+1)); //标志 int* C = (int*)malloc(sizeof(int)*(n+1)); //C中存放的是每个子问题的最优解 int max = -INT_MAX; int i,j; C[0] = 0; for(i=1;i<=n;i++) { if(C[i-1]+A[i-1] >= A[i-1]) { C[i] = C[i-1] + A[i-1]; B[i] = 1; } else { C[i] = A[i-1]; B[i] = 0; } if(C[i] > max) max = C[i]; } pair p = {C,B,max}; return p; } //打印出和最大的连续子数组 void print(pair p,int* A,int n) { int i = 0, j = 0; for(i=1;i<=n;i++) { if(p.C[i] == p.max) j = i; } for(i=j;i>=1 && p.B[i] == 1;i--) { printf("%d ",A[i-1]); } if(p.B[i] == 0) printf("%d ",A[i-1]); } int main() { int A[] = {-1,0,-2,2,3,6,7,-8}; pair p = sum(A,8); printf("连续子数组的最大和为:%d ",p.max); printf("和最大的连续子数组为: "); print(p,A,8); return 0; }