二维数组求最大值

设计思想:
      首先要用一段代码,可以读入txt文件里的二维数组。需要将txt文件放入同一目录。 
      其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法。思路如下:

   1.得到子数组的最大行、列数,从第一行开始,确定最大子数组的行列范围。

   2.将确定的范围,把最大子数组按照一列有几个数,按行分开成。(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致)

   3,对2中得到的数组,利用一维数组求子数组之和的方法。求出最大值,比较得到最大的一个

   4.使行列的最大上界下减1,重复进行第2 、3、4步。

源程序代码:

#include<iostream>
#include <stdio.h>
using namespace std;

FILE *fpRead=fopen("input.txt","r");

char cgetchar(){
	char c;
	fscanf(fpRead,"%c",&c);
	return c;
}

int getnum(){
	char c;
	int num = 0, fuhao = 1;
	while((c = cgetchar()) != EOF && (‘0‘ > c || ‘9‘ < c) && c != ‘-‘);
	if(c == ‘-‘) fuhao = -1;
	else num = c - ‘0‘;
	while((c = cgetchar()) != EOF && ‘0‘ <= c && ‘9‘ >= c){
		num = num * 10 + c - ‘0‘;
	}
	return num * fuhao;
}

int main ()
{
    int x,y,i,j,m=0,A[100][100];

    x = getnum();
	y = getnum();
    if(x>100||y>100)
    {
        cout<<"请重新输入:";
        cin>>x>>y;
    }
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            A[i][j] = getnum();
            printf("%d ", A[i][j]);
        }
        printf("\n");

    }
    int sum[100]={0},max=0,result=A[0][0];

    for(i=0;i<x;i++)//确定子数组的最大上界(为第i行)
    {
        while(m+i<x)//确定子数组有m+i行
        {
            //把子数组当成一位数组一样,求最大子数组的和
            for(j=0;j<y;j++)
            {
                sum[j]=sum[j]+A[m+i][j];

            }
            max=0;
            for(j=0;j<y;j++)
            {
                if(max+sum[j]>sum[j])
                {
                    max=max+sum[j];
                }
                else
                {
                    max=sum[j];
                }
                if(max>result)
                {
                    result=max;
                }
            }
            m++;//是子数组的行数+1
        }
		m=0;
		for(j=0;j<y;j++)
		{
			sum[j]=0;
		}
	}
	cout<<result;
	return 0;
}

input.txt文件截图:

运行结果截图:

 

项目计划总结:

我和队友的合照(张洪胜  苏雄)

原文地址:https://www.cnblogs.com/zhs20160715/p/9822474.html

时间: 2024-11-08 23:38:18

二维数组求最大值的相关文章

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

环形二维数组求最大子矩阵

1.设计思路 结合环一位数组的开发经验,拓展到二维.与前者主要是时间复杂度没有做处理. 2.源代码 1 //作者:王炳午.董龙洋.日期:2015.3.24. 2 #include <iostream> 3 #include<stdlib.h> 4 #include<time.h> 5 using namespace std; 6 int maxMax(int amax[]) //求最大 7 { 8 int i; 9 int sum = 0; 10 int max; 11

首尾相连的二维数组求最大字数组的和

题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用. (1)代码: #include<iostream>using namespace std;#define N 4 void m

二维数组的最大值

一.题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二:结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三.代码: #include <iostream>#include <

二维数组求最大子数组和(环形)

一.实验题目 返回一个二维数组中最大子数组的和. 实验要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.实验思路 这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推.求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1 

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat

体验结对开发的乐趣(5)--(首尾相连的二维数组求最大子数组和的问题)

结对伙伴:信1201-2班高扬.信1201-1班韩雪东 一.题目要求与设计思想 题目要求:在上一次的基础上把数组变为二维数组,然后首尾相接,形成连环,然后求和最大的子数组: 设计思想:一维数组首尾相连的问题已经得到解决,二位数组求和最大的子数组的问题也已经解决了,就是把这两个程序思想融在一起,然后在短短的时间内就完成了这次课堂项目. 二.源代码 1 // erweishuzuqiuzuida.cpp : Defines the entry point for the console applic

二维数组找最大值

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 我得思路是从左上角开始,即arr[0][0],将这个整数和它相比,如果比它大,那么将这个整数和arr[1][1]比 如果还大那么继续,如果小于arr[n][n],那么去arr[n][n]这个元素的左面和上面找,如果有说明在这个数组中 没有说明不在 这个想法首先只适用于方阵,并且查找效率并不是最好 答案的解法是从左下角开始 如果整