zoukankan      html  css  js  c++  java
  • 环二维数组问题

    题目:

        输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    设计思路:

    把它转化成环一维数组的问题。把二维数组的列加起来,看作是一个以为数组,再利用一维数组的问题来解决它。

    实验代码;

    #include<iostream.h>
    int max2(int arry[],int length)  //跨越arry[n-1]、arry[0]的最大和
    {
        int total=0;
        int sum=arry[0];
        int minsum=arry[0];
        for(int i=1;i<length;i++)
        {
            if(sum>0)
            {
                sum=arry[i];
            }
            else
            {
                sum=sum+arry[i];
    
            }
            if(minsum>=sum)
            {
                minsum=sum;
            }
            total=total+arry[i];
        }
        total=total+arry[0];
        minsum=total-minsum;
    
        return minsum;
    }
    
    
    int max1(int arry[],int length)   //不跨越零点的最大和
    {
        int sum=arry[0];
        int maxsum=arry[0];
        for(int i=1;i<length;i++)    //求出相邻数组最小和
        {
            if(sum<0)
            {
                sum=arry[i];
            }
            else
            {
                sum=sum+arry[i];
    
            }
            if(maxsum<=sum)
            {
                maxsum=sum;
            }
        }
        //struct ret ret1={maxsum,start2,end};
        return maxsum;
    }
    int column(int a[][20],int length,int num1) //求最大和
      {
          int y=0;
          int d[20];
          int e[100];
          int c[100][20];
          c[0][0]=0;
          int p=0;
          int b[100]={0};
          for(int j=0;j<num1;j++)
          {
              for(int t=j;t<num1;t++)
              {
                  for(int i=0;i<length;i++)
                  {
                      b[i]=b[i]+a[t][i];
                      c[p][i]=b[i];
                  }
                  p=p+1;
              }
              for(int o=0;o<100;o++)
              {
                  b[o]=0;
              }
          }
          for(int l=0;l<p;l++)
          {
    
              for(int u=0;u<length;u++)
              {
                  d[u]=c[l][u];
                  //cout<<d[u]<<"  ";
              }
              e[y++]=max1(d,length);
              e[y++]=max2(d,length);
              //cout<<e[y-1]<<"  ";
          }
          int Max=e[0];
          for(int i=0;i<y;i++)
          {
    
              if(e[i]>=Max)
             {
                 Max=e[i];
                }
             }
          return Max;
    }
     int main()
    {
         int a[20][20];
         int length,index;
    
         cout<<"输入行数列数:";
         cin>>index>>length;
    
         int y=0;
         for(int i=0;i<index;i++)
         {
             for(int j=0;j<length;j++)
             {
                 cin>>a[i][j];
             }
         }
    
         int s=column(a,length,index);
         cout<<"最大和为:"<<s<<endl;
         return 0;
     }

    实验截图:

    实验反思:

    要学会把未知的问题转化成已知的问题,把不会的问题分解成会的问题来解,这个题目就是这样,开始我把二维数组首尾连起来,发现特别麻烦,而采用这个方法,转化成环一维数组求最大值,就非常的方便了。

  • 相关阅读:
    (五)Spring Cloud教程——Config(F版本)
    (四)Spring Cloud教程——Zuul(F版本)
    (三)Spring Cloud教程——Hystrix(F版本)
    (二)Spring Cloud教程——Ribbon 和 Feign(F版本)
    (一)Spring Cloud教程——Eureka(F版本)
    3年的坚持,最终造就著作——《Learninghard C#学习笔记》
    WPF快速入门系列(9)——WPF任务管理工具实现
    WPF快速入门系列(8)——MVVM快速入门
    [WPF实用技巧]如何使WPF的TreeView节点之间有连线
    WPF快速入门系列(7)——深入解析WPF模板
  • 原文地址:https://www.cnblogs.com/twentytwo/p/4594224.html
Copyright © 2011-2022 走看看