求二维数组环的最大的子数组的和

#include<iostream>
using namespace std;
void max(int row,int col)
{

    int ** a=new int*[row+1];
    int ** b=new int*[row+1];
    int h;//用于每一个一维数组上已经相加元素的个数够一个环则开始下一个
    for(int i=1;i<=row;i++)
    {
        a[i]=new int[2*col];
    }
    for(int i=1;i<=row;i++)
    {
        b[i]=new int[2*col];
    }
    cout<<"请输入"<<row<<""<<col<<"列的数组的元素"<<endl;

    int count=0;
    for(int i=1;i<=row;i++)
    {
        for(int j=1;j<=col;j++)
        {
            cin>>a[i][j];
            b[i][j]=a[i][j];
            if(a[i][j]<0)
            {
                count++;
            }
        }
    }
    for(int i=1;i<=row;i++)//将二维数组加倍成环
    {
        for(int j=col+1;j<=2*col-1;j++)
        {        
            a[i][j]=a[i][j-col];
        }
    }
    /*cout<<"所输入的数组为:"<<endl;
    for(int i=1;i<=row;i++)
    {
        for(int j=1;j<=2*col-1;j++)
        {        
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }*/
    int k,n=2;
    if(count<row*col)//即不是所有的元素都是负数的情况
    {
        int sum=0;
      for(int m=1;m<=row;m++)
      {
        k=n;
        for(int i=1;i<=row;i++)
       {
         for(int j=1;j<=2*col-1;j++)
        {
            b[i][j]=a[i][j];
        }
       }//b[i]是经过元算后的数组而a[i]用于保留原数组
        for(int i=m;i<=row;i++)
       {
        while(k<=i)//只有在行数大于等于2时才出现两行相加
        {
          for(int j=1;j<=2*col-1;j++)
         {
                b[k][j]=b[k-1][j]+b[k][j];
         }
          k++;
        }
      }
        /*cout<<"b"<<endl;
        for(int i=1;i<=row;i++)
       {
         for(int j=1;j<=2*col-1;j++)
        {
            
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
       }*/
        n++;
        
     for(int i=m;i<=row;i++)
      {
          int c=0;
          h=1;
          while(h<=col)
          {
           for(int j=h;j<=col-1+h;j++)
           {
             if(c<0)
            {
                c=b[i][j];
            }
            else
            {
            
                c=c+b[i][j];
            }
           if(sum<c)
           {
             sum=c;
           }
           //cout<<sum<<"  ";
          }
          h++;
          c=0;//一圈结束c清零sum保持
         }
        
     }
    }
    cout<<endl;
    cout<<"最大子数组的和为:"<<sum;
    }
    else
    {
        int sum=a[1][1];
    
       for(int i=1;i<=row;i++)
      {
        for(int j=1;j<=col;j++)
        {
           if(a[i][j]>sum)
           {
               sum=a[i][j];
           }
        }
      }
              cout<<endl;
    cout<<"最大子数组的和为:"<<sum;
    }
    for(int i=1;i<=row+1;i++)//删除动态数组
    {
        delete []a[i];
        a[i]=NULL;
    }
    for(int i=1;i<=row+1;i++)//删除动态数组
    {
        delete []b[i];
        b[i]=NULL;
    }
}
void main()
{
    int row,col;//行和列数
     cout<<"请输入数组的行数和列数:";
    cin>>row>>col;
    max(row,col);
}

结果截图:

转载于:https://www.cnblogs.com/yuntianblog/p/4456077.html

二维数组最大数组的和,可以使用动态规划算法。 具体思路是,先将二维数组每一行作为一个一维数组,对每一行进行最大数组和,得到一个一维数组。然后对这个一维数组再次进行最大数组和,得到最终的最大数组和。 以下是使用 Python 实现的代码: ```python def max_subarray_sum(arr): """ 一维数组最大数组和 """ max_sum = arr[0] cur_sum = arr[0] for i in range(1, len(arr)): cur_sum = max(cur_sum + arr[i], arr[i]) max_sum = max(max_sum, cur_sum) return max_sum def max_submatrix_sum(matrix): """ 二维数组最大数组和 """ rows = len(matrix) cols = len(matrix[0]) max_sum = float('-inf') for i in range(rows): # 将每一行作为一个一维数组最大数组和 temp = [0] * cols for j in range(i, rows): for k in range(cols): temp[k] += matrix[j][k] # 对一维数组最大数组和 cur_sum = max_subarray_sum(temp) max_sum = max(max_sum, cur_sum) return max_sum ``` 其,`max_subarray_sum()` 函数用来一维数组最大数组和,`max_submatrix_sum()` 函数用来二维数组最大数组和。 我们可以先将每一行作为一个一维数组,对每一行进行最大数组和,得到一个一维数组。然后对这个一维数组再次进行最大数组和,得到最终的最大数组和。 接下来,我们可以使用以下代码测试一下: ```python matrix = [ [1, -2, 3, 0], [-1, 5, -2, 2], [3, 0, 0, -1] ] print(max_submatrix_sum(matrix)) # 输出 8 ``` 输出结果为 8,符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值