• 在一整型数组中找到此数组中子数组和的最大值


    讨论的思想:
    1:想要求一整型数组的子数组的最大值那么我们的想法是从第一个数往后加直到数组末尾,然后再从第二个数往后加直到末尾以此类推,在相加的时候通过一个sum保存几个数相加的和并把它存在一个二维数组中,二维数组记录从第几个数加到第几个数的和。例如:从第一个数加到第三个数那么sum的值就是这三个数的值,再将其保存在b[1][3]中。
    2:当从第二个数开始往后加的时候需要另一个循环控制所以需要两个循环i,j;j=i,这样可以减少一些不必要的数据存储。
    for(i=0;i<5;i++)
       {
            sum=0;
     for(j=i;j<5;j++)//j从i处开始往后加
    3:将数据都存储到了二维数组b[i][j]时在找到这个数组的最大值,并且记录此时的位置,即可求出这个整型数组最大子数组的值及位置。

    出现的问题:开始没有考虑到sum重置,当从第二个数往后相加时sum需要重置否则会越来越大。
                没有考虑到j从i开始,导致出现了b[1][2]和b[2][1]的这种情况。

    代码:

    #include<stdio.h>
    int main()
    {
        int a[5],b[5][5];
        int i,j,sum,max,m,n;
        printf("输入5个整数
    ");
        for(i=0;i<5;i++)
            scanf("%d",&a[i]);//输入数据
        for(i=0;i<5;i++)
        {
            sum=0;
            for(j=i;j<5;j++)//从第一位开始往后相加求和
            {
                sum+=a[j];
                b[i][j]=sum;//保存到二维数组中
            }
        }
        max=b[0][0];
        for(i=0;i<5;i++)//比较二维数组找到里面的最大值
        {
            for(j=i;j<5;j++)
            {
              if(b[i][j]>max)
              {
                  max=b[i][j];
                  m=i+1;//记录最大值的位置
                  n=j+1;
              }
            }
        }
        printf("最大值和为:%d   他是从第%d 加到第%d 位的和
    ",max,m,n); 
        return 0;
    }

    结果:

    课上讨论:

     

  • 相关阅读:
    树上路径(树链剖分)
    P4178 Tree(点分治)
    P2146 [NOI2015] 软件包管理器(树链剖分)
    P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
    poj1182 食物链(带权并查集)
    poj3026 Borg Maze(bfs+prim)
    最佳牛围栏(二分)
    串(dp)
    POJ1258 Agri-Net
    POJ2031 Building a Space Station(prim)
  • 原文地址:https://www.cnblogs.com/wangweiguang/p/3591591.html
Copyright © 2020-2023  润新知