二维数组的最大联通子数组和

设计题目:求一个二维数组的连通的数组中和最大的最大值。

设计思路:

建立二维数组并遍历二维数组,将所有正整数分块,验证是否联通,如果不联通,判断路径。

package demo;
import java.util.*;
public class Lmax {
static Scanner scanner = new Scanner(System.in);
public static void main(String args[]){
int m,n;
int b;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入二维数组的列数:");
m = scanner.nextInt();
System.out.println("请输入二维数组的行数:");
n = scanner.nextInt();
int arr[][] = new int[n][m];
System.out.println("请输入:");
for(int i = 0;i<n;i++)
for(int j=0;j<m;j++)
{
arr[i][j] = scanner.nextInt();
}
System.out.println("\n");
b = maxArrSum(arr);
System.out.println("最大联通数组和为"+b);
}

public static int[][] arrSum(int arr[][]){
int m = arr.length;
int n = arr[0].length;
int p[][] = new int[m+1][n+1];
p[0][0] = arr[0][0];
for(int i=0; i<=m; i++) p[i][0] = 0;
for(int i=0; i<=n; i++) p[0][i] = 0;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
p[i][j] = p[i-1][j] + p[i][j-1] + arr[i-1][j-1] - p[i-1][j-1];
}
}
return p;
}

static int maxArrSum(int arr[][]){
int m = arr.length;
int n = arr[0].length;
int p[][] = arrSum(arr);
int ans = Integer.MIN_VALUE;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
for(int endi=i; endi <=m; endi++){
for(int endj=j; endj<=n; endj++){
int sum = p[endi][endj] - p[i-1][endj] - p[endi][j-1] + p[i-1][j-1];
if(ans < sum) ans = sum;
}
}
}
}
return ans;
}

}

程序截图:

总结:这次作业的完成,是我和张家星同学共同努力找出思路并完善程序的,实现的算法较为复杂,在我们互相的讨论下才能逐渐发掘,进行复杂问题的简单化,并成功编写。

时间: 2024-08-25 10:56:54

二维数组的最大联通子数组和的相关文章

结对开发之最联通子数组

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

用reduce装逼 之 多个数组中得出公共子数组,统计数组元素出现次数

昨天做了一道美团的面试题,要求是给N个数组,找出N个数组的公共子数组. var a = [7,2,3,4,5]; var b = [4,2,3,7,6]; var c = [2,3,3,3,7]; var d = [4,2,3,8,7]; 以上四个数组,有公共子数组2, 3,7 function main(){ var result = []; var arr = arguments[0]; for(var i=1 ; i<arguments.length ; i++){ var arr = a

二维数组最大联通子数组和

1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值. 2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚. 3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出:当列数为1时,当成一维计算: 4.源代码: /*返回一个整数数组中最大子数组的和. 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.

二维数组中的最大联通子数组

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: 总结:

结对开发Ⅵ——循环二维数组求和最大的子数组

一.题目及要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数.    二维数组首尾相接,象个一条首尾相接带子一样.     数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.  求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 (1)二维数组我们采用的还是数组的形式: (2)读取nxm的二维数组,储存成nx2m,把前m列重复加在二维数组的最后: (3)搜索最大数组的方法和不循环的二维数组是一样的,就是再加上判断条

最大联通子数组

1.题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思路 对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使

[luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直线按斜率从大到小排序后,第 k 条直线的斜率为多少. 为了避免精度误差,请输出斜率向下取整后的结果.(例如: ?1.5? = 1 , ??1.5? = ?2 ) 分析 一开始打了一个暴力,10分后来改着改着成了30分,浮点误差. 正解其实很简单,我们首先逆向思考一下,如果我们假设已经有了斜率k. 如

结对开发Ⅴ——循环一维数组求和最大的子数组

一.设计思路 (1)数据的存储结构是链表,最后一个结点的next指向第一个元素的结点: (2)数据个数为n,则最多有n*(n+(n-1)+...+1)种情况(包括重复): (3)剩下的部分与二维数组的差不多. 二.源代码 1 // 一维数组.cpp : Defines the entry point for the console application. 2 // 袁佩佩 于海洋 3 4 #include "stdafx.h" 5 #include<iostream.h>