zoukankan      html  css  js  c++  java
  • 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。

    给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列;如果都是负数,则输出最大和是0。

     1 // 连续元素相加和为最大的序列(有正有负).cpp : 定义控制台应用程序的入口点。
     2 
     3 #include "stdafx.h"
     4 
     5 int max(int a,int b,int c)
     6 {
     7     double max_v=a;
     8     if(b>a)
     9         max_v=b;
    10     if(c>max_v)
    11         max_v=c;
    12     return max_v;
    13 }
    14 
    15 int min(int a,int b,int c)
    16 {
    17     double min_v=a;
    18     if(b<a)
    19         min_v=b;
    20     if(c<min_v)
    21         min_v=c;
    22     return min_v;
    23 }
    24 
    25 int Maxadd(int count,int *a,int &x,int &y)
    26 {
    27     int *Min=new int[count+1];//Min[i]代表以a[i]结尾的最小连续序列的和
    28     int *Max=new int[count+1];//Max[i]代表以a[i]结尾的最大连续序列的和
    29     Min[0]=a[0];
    30     Max[0]=a[0];
    31     int max_val=Max[0],maxpos=0;
    32     for(int i=1;i<count;i++)
    33     {
    34         Max[i]=max(a[i],a[i]+Max[i-1],a[i]+Min[i-1]);
    35         Min[i]=min(a[i],a[i]+Max[i-1],a[i]+Min[i-1]);
    36         if(Max[i]>max_val)
    37         {
    38             max_val=Max[i];
    39             maxpos=i;//以a[maxpos]结尾的连续序列和最大
    40         }
    41     }
    42     int sum=a[maxpos],j=maxpos;
    43     while(sum!=max_val)
    44     {
    45         j--;  //j是最大和连续子序列中的第一个下标
    46         sum+=a[j];
    47     }
    48     x=j;
    49     y=maxpos;
    50     delete [] Max;
    51     delete [] Min;
    52     return max_val;
    53 }
    54 
    55 void main()
    56 {
    57     int maxsum;
    58     int a[]={1,-2,3,5,-4,6};
    59     int len=sizeof(a)/sizeof(a[0]);
    60     //for(int j=0;j<len;j++)
    61     //{
    62     //    printf("%4d",a[j]);
    63     //}
    64     //printf("\n");
    65     int num=0;
    66     for(int k=0;k<len;k++)
    67     {
    68         if(a[k]<0)
    69             num++;
    70     }
    71     if(num==len) //如果元素都是负数,则输出最大和是0。
    72         maxsum=0;
    73     else
    74     {
    75         int x=0,y=0;
    76         maxsum=Maxadd(len,a,x,y);
    77         for(int i=x;i<=y;i++)
    78         {
    79             printf("%4d",a[i]);//打印最大和的子序列
    80         }
    81     }
    82     printf("\nmaxadd=%d\n",maxsum);;
    83 }
  • 相关阅读:
    linux 下的mysql
    linux历史命令,索引与键
    root用户删除恢复,mysql二进制及源码安装,mysql关闭,重启,开启命令
    pip3换源,grep,sed ,awk 三剑客,通配符,linux运行django项目
    软硬连接,find命令date命令,du大文件, tar zip压缩解压命令,
    微服务 架构 php+go
    go 优秀 博客文档
    go-001[常用命令]
    go 0000
    web 安全:
  • 原文地址:https://www.cnblogs.com/xingele0917/p/2711640.html
Copyright © 2011-2022 走看看