和最大的连续子数组

// 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 \n",p.max);
    printf("和最大的连续子数组为:\n");
    print(p,A,8);

    return 0;
}

 

posted @ 2013-12-30 12:19  挡不住会飞的鸡  阅读(151)  评论(0编辑  收藏  举报