二位数组升级版

一、题目及要求:

返回一个整数数组中最大子数组的和

输入一个二维整形数组,数组里有正数也有负数;二维数组首尾相接,像一条首尾相接的带子一样。

二、设计思路:

这个题目其实与上次毫无区别,仍然调用循环一维数组求最大子数组的函数,将二维数组列的情况全

部列出,即转化为一维数组。a[0][0],a[0][0]a[0][1]........。在调用函数即可。

三、源代码

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

四、截图

五、感想

对于这次实验仅简单的调用了上次函数,用时很少。不过这次我领航,没有书写任何代码,当看到伙伴再写代码

时,似乎看到自己最容易犯的错,例如大括号,即等号与赋值号。当他写代码时,也比只看着更有感觉,交换一下

位置原来可以看到的更多。也许,好像这是最后一次结对开发,在此,感想一直相互合作的队友,亦是兄弟。

时间: 2024-12-19 08:04:42

二位数组升级版的相关文章

C++ 出现bug :二位数组的操作运算,求非对角线的元素的和

编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; class MATRIX { public: void mATRIX(); void MATRIX_sum(); void MATRIX_display(); static int fact_len;//定义静态变量 private: int sum; int a[40][40]; }; int MATRIX

在控制台输入字母然后在控制台打印相应的二位数组字母,要求一行打印

1 package MyHomeWork; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.Scanner; 6 7 /** 8 * Created by zhouyubin on 7/11/14. 9 */ 10 public class Test2 { 11 private static final char[][] print_a={{' ',' ',' ','A',' ',' ',' ','

二位数组环状最大子矩阵

由于上次二位数组,使用了函数,所以这次只要修改函数就可以了. //Powered by lzr! #include<iostream> using namespace std; int yiwei_max(int n,int a[]) { int temp=0,sum=-999999999; int j=0,k=0,i; for(i=0;i<n;i++) { if(temp>0) { temp+=a[i]; } else { temp=a[i]; if(a[i]>0 &

二位数组中的查找——杨氏矩阵

------------------------------------------------------------------------------------------------- "杨氏矩阵":即数组元素从左向右依次递增,从上到下依次递增.要想在该数组中查找数,首 先该数组得满足"杨氏矩阵"的特点.为了方便理解我们可以将一个二位数组看作是一个矩阵,假设i 为行,j为列,数组为str,那么只要满足(str[i][j]<str[i][j+1] &a

二位数组传参及二位数组动态分配问题

//二位数组参数传递 //1. void display1(int arr[][4], const int rows) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 4; j++) { cout << arr[i][j] << ' '; } cout << endl; } cout << endl; } //2. void display2(int(*parr)[4], const

二位数组

一.题目及要求: 返回一个整数数组中最大子数组的和 输入一个二维整形数组,数组里有正数也有负数:二维数组首尾相接,像一条首尾相接的带子一样. 二.设计思路: 调用循环一维数组求最大子数组的函数,将二维数组列的情况全部列出,即转化为一维数组. 三.源代码 #include<iostream.h> int max2(int arry[],int length) //跨越arry[n-1].arry[0]的最大和 { int total=0; int sum=arry[0]; int minsum=

JAVA遍历二位数组的方法

//使用方法对于二维数组进行遍历 package com; import java.util.Arrays; public class CompoundInterest { public static void main(String[] args) { // TODO Auto-generated method stub double[][] balances= new double[3][3]; for(int j = 0; j < balances[0].length; j++){ bal

c语言二位数组与指针

问题,以下输出的结果是什么,区别在于哪? void main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; //输出的3个地址都一样,差别在哪? printf("\n%x",a); printf("\n%x",*a); printf("\n%x",&a); system("pause"); } 像我这种野生码农看到这个问题基本懵了,好吧我们先通过一维数组来理解. v

二位数组与指针

#include<stdio.h> #include<iostream> using namespace std; void disparry(int a[2][3]) { printf("\n%d,%d,%d",a[0][0],a[0][1],a[0][2]); } int main(void) { int arr[2][3]={{2,3,1}, {23,45,6}}; //c是一个指针,指向的元素int[3],即arr的行元素 int (*c)[3]=arr