环二维数组问题

题目:

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

设计思路:

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

实验代码;

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

实验截图:

实验反思:

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

posted @ 2015-06-22 23:23  twenty丶two  阅读(309)  评论(0编辑  收藏  举报