• 最大子数组和01


    1、题目要求:

      (1)输入一个整形数组,数组里有正数也有负数;

      (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;

      (3)求所有字数组的和的最大值,要求时间复杂度为O(n)。

    2、实现思路:

      (1)先要输入一组整形数,直到输入回车结束;

      (2)分离出每一个数,按顺序存放到整形数组里;

      (3)每一个、相连续两个、三个……都是子数组,分别求出子数组的和,把最大的和输出。

    3、思路整理(实现步骤):

      (1)输入数组元素,用空格分开,输入的是字符,转化为整形数,连续的0~9字符,按所在数位进行放大求和,得出输入的整形数;

      (2)若输入的字符是空格,则将空格前的数存放入整形数组中;

      (3)按回车,输入结束,开始计算;

      (4)计算过程:

                    从第一个数开始,依次比较大小,最大的数单独存放在num1;

          第一个数,开始,求arr[1]+arr[2]+……+arr[n],将所有和的最大值与num1 比较,最大值存入num1;

          再求arr[i]+arr[i+1]+……+arr[k],将所有和的最大值与num1 比较,最大值存入num1;

          直到arr[i] 为最后一个数为止,num1 即为子数组最大的和。

    4、源代码:

    #include <iostream>
    #include <string>
    #include<ctime>
    #include<cmath>
    #define N 10
    using namespace std;
    
    char arr[1000];
    string str;
    int arr1[100];
    
    int k=0;
    void chtoin()
    {
        int i=0;
        int j=10;
        
        int num1=0;
        int num2=0;
        bool flag=0;
        char ch[]="#";
    
        cout<<"请输入数组(中间以空格隔开):"<<endl;
        gets(arr);
    
        strcat(arr,ch);
        
        for (;;)
        {
            
            
            if(arr[i]=='#')
            {
                if (flag==0)
                {
                    arr1[k]=num2;
                    k++;
                }
                else
                {
                    arr1[k]=0-num2;
                    k++;
                }
                break;
            }
            else
            {
                if (arr[i]==' ')
                {
                    if (flag==0)
                    {
                        i++;
                        arr1[k]=num2;
                        num2=0;
                        k++;
                    }
                    else
                    {
                        i++;
                        arr1[k]=0-num2;
                        num2=0;
                        flag=0;
                        k++;
                    }
                    
                }
                else if (arr[i]=='-')
                {
                    i++;
                    flag=1;
                }
                else
                {
                    num1=arr[i]-'0';
                    num2=num1+num2*j;
                    i++;
                }
            }
        }
    }
    void main()
    {
        int j=0;
        int i=0;
        chtoin();
    
        int num1=arr1[0],num2=0;
        for(;;)
        {
            num2+=arr1[i];
            if (num2>num1)
            {
                num1=num2;
            }
            if (j==N)
            {
                break;
            }
            else
            {
                if (i==N-1)
                {
                    num2=0;
                    j++;
                    i=j-1;
                }
            }
            i++;
        }
        cout<<num1<<endl;
    }

    5、运行结果

     

    23-4+5+7-3+6=34

    5+7-5+34=41

                              项目计划日志(单位:h):

      听课 编写程序 阅读相关书籍 网上查找资料   日总计
    周一 2 0 1 0.5 3.5
    周二 0 1 0.5  0 1.5
    周三  0 2 0  0 2
    周四 2 1.5  0 1.5 5
    周五  0 2 0.5 0 2.5
    周六  0 3 0  0 3
    周日          
    周总计 4 9.5 2 2 17.5

                             时间记录日志(单位:min):

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    星期一 14:00 15:50 10(课间) 100 听课 软件工程上课
      19:30 21:30 30 90 阅读、上网查资料  
    星期二 19:30 21:30 30 90 编程、阅读  
    星期三 14:00  15:00 0  60 编程 数组最大子数组之和
      19:00 20:30 30 120 编程
    星期四 14:00 15:50 10(课间) 100 听课 软件工程上课
      16:20 17:30 0 70 编程、上网查资料 数组最大子数组之和2的程序
      19:30 21:00 30 60 编程 数组最大子数组之和2的程序
    星期五 14:00 17:00 60 120 编程 数组最大子数组之和2的程序
    星期六 8:00 11:30 30(洗漱) 180 修改,调试,发布 数组最大子数组之和程序进行修改、调试、写博客并发布

    队友地址:http://www.cnblogs.com/mengyinianhua/

  • 相关阅读:
    记事本02
    助人快乐:笔记本连网
    高性能 架构实例 学习笔记
    食.运动.阅读
    The server name ... address could not be resolved
    Mysql 远程访问
    CSS布局 UI 学习笔记
    MySql 修改root密码
    C#:String类型中的CharAt 方法
    La_Lb_Lc
  • 原文地址:https://www.cnblogs.com/wangyw/p/5312666.html
Copyright © 2020-2023  润新知