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;
     }

    实验截图:

    实验反思:

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

  • 相关阅读:
    输入输出重定向
    Tkinter程序屏幕居中
    从Web Controls到DHTML学习随想
    一个没暂时没有办法实现的问题和一个有意思的小问题!
    [学习笔记]几个英语短句(1)
    [读书笔记]My LifeBill Clinton
    [学习笔记]几个英语短句(2)
    结合MS Web Controls做文件上传的解决方案!
    IIS的一个莫名错误--Server Application Unavailable
    Google Sitemaps(测试版)帮助:使用 Sitemap 协议
  • 原文地址:https://www.cnblogs.com/twentytwo/p/4594224.html
Copyright © 2011-2022 走看看