二维数组和最大字数组求取 2

题目:

返回一个二维数组的和最大字数组的和

要求:

随机生成二维数组,要求数组元素有正有负

二维数组首尾相连

数组中连续的n(n>=1)元素组成数组的字数组

源代码:

import java.util.Random;

import java.util.Scanner;

public class erweixunhuanzishuzu {

public static void main(String[] args) {

//产生随机数组

int array[][] = new int[1000][1000];

int arraytemp[] = new int [1000];

int row,col,sum,sumTemp;

int t,m;

int qx=0,qy=0;

int zx=0,zy=0;//分别记录子数列的起始和结束位置

for(int i=0;i<1000;i++)

arraytemp[i]=0;

System.out.print("请分别输入数组的行数和列数:");

Scanner sc=new Scanner(System.in);

row = sc.nextInt();

col = sc.nextInt();

Random r = new Random();

System.out.println("产生的随机数序列为:     ");

for(int i=0;i<row;i++){

for(int j=0;j<col;j++){

array[i][j]=r.nextInt()%10;

array[i][j+col]=array[i][j];

}

}

for(int i=0;i<row;i++){

for(int j=0;j<col;j++){

System.out.print(array[i][j]+"   ");

if(j == col-1)

System.out.println("");

}

}

//求最大子数组

sum=array[0][0];

sumTemp=sum;

for(int i=0;i<row;i++){

for(int x=0;x<1000;x++)

arraytemp[x]=0;

for(t=i;t>=0;t--){

for(int s=0;s<2*col;s++){

if(t>=0){

arraytemp[s]+=array[t][s];

//qx=t;

//qy=s;

//System.out.println("&"+qx+" "+qy);

//System.out.println("%"+arraytemp[s]+"%");

}

}

sumTemp=arraytemp[0];

m=0;

for(int j=0;j<2*col;j++){//按列消元

if(sumTemp<=0){

sumTemp=0;

m=j+1;

//qx=t;

//qy=j;

//System.out.println("&1 "+qx+" "+qy);

}

//System.out.println("#"+sumTemp+"#");

//System.out.println("*"+arraytemp[j+1]+"*");

if(j+1<qy+col){

sumTemp+=arraytemp[j+1];

if(sumTemp>sum){

sum=sumTemp;

qx=t;

qy=m;

zx=i;

zy=j+1;

//System.out.println("@"+qx+" "+qy);

//System.out.println("%"+zx+" "+zy);

}

}

/*else

break;*/

}

}

}

System.out.println("最大子数组的和为:"+sum);

System.out.println("子数组为:");

for(int i=qx;i<=zx;i++)

for(int j=qy;j<=zy;j++){

System.out.print(array[i][j]+" ");

if(j==zy)

System.out.println("");

}

}

}

结果截图:

编程总结:

现在对于模块化编程逐渐有了自己的理解了,从一开始听说这个概念,只知其然,不知其所以然,经过这几次有关于数组代码的编写,“所以然”逐渐的浮现出来了。

一个新的问题的出现,总能够根据其特点,依据不同的着重点,将一个问题细化成许多“小组件”,解决这些小组件要比直接解决大问题本身要容易的多。

对于此次编程的收获:

看到本次的编程要求,感觉上应该分为两个方面的问题:

1、 实现二维数组的自身“环化”

2、 和最大字数组的求取问题

因为处于对自己水平的了解,我现在需要做的是多吸收别人编程的算法,思想,当然,这只是用来提高自己编程水平的一个阶段,随着这种练习的增加,我相信会有更多的收获和理解的,只要我肯去做,而不是想象着我要去做。

现在有一个初步的体会,许多算法是可以组合起来的,一些以前自己实现过的算法经过合理的安排,就能够解决一个新产生的问题,这是一种源于日积月累解决问题的方法,需要自己长时间的坚持和努力。

我在路上~

时间: 2024-10-09 21:53:31

二维数组和最大字数组求取 2的相关文章

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

(hdu step 6.1.2)Eddy&#39;s picture(在只给出二维坐标点的情况下,求让n个点连通的最小费用)

题目: Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 172 Accepted Submission(s): 126   Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to be

POJ - 2155 Matrix (二维树状数组 + 区间改动 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)

POJ - 2155 Matrix Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we ha

结对开发--求环数组的最大字数组

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如 果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 这次的主要问题在于这次的一位数组要首尾相连,允许A[i-1], …… A[n-1], A[0]……A[j-1]

二维数据和一维指针数组

1.二维数组名a的含义: 定义一个二维数组a : int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}}; a数组包含3个行元素,a[0],a[1],a[2]. 每个行元素a[i] 又是一个一维数组,它包含4个元素. a == &a[0] a + i == &a[i] a[0] == &a[0][0] a[i] == &a[ i ][0] 2.二维数组地址的关系:(地址由行至列以元素类型递增) 3.二维数组与一维指针数组

一个整数数组中最大字数组二

返回整数数组中最大子数组的和2 1.题目: 返回一个整数数组中最大子数组的和. 2.要求: 1)要求程序必须能处理1000个元素: 2)每个元素都是int32类型的. 3.设计思路: 处理1000个元素时让用户自己输入想要的数组长度,看看运行时出处理时间的长短,再在源程序中改善这一问题. 处理大数溢出时,由于随机函数生成的数不算太大,我们尽量让其最终存入数组的元素接近最大范围,进而求和时才可能出现大数溢出的情况. 4.源代码: 1 #include<iostream> 2 #include&l

返回一个整数数组中最大字数组的和(一维数组首尾相连)

一.设计思想 总思路:先实现正常数组的所有子数组的和的最大值,再将数组中的元素首尾相接,按照正常数组的判断方法即可. 判断所有子数组的和的最大值:先将最大值和起始值设置为第一个元素,将起始值轮流相加,如果<0,置0把前面弃掉,并在循环中不停与最大值比较,如果大于最大值,将其值给最大值. 将元素中的元素首尾相接:环状与正常数组区别为环状还可以首尾部分成为子数组,将环状截断可以成为正常子数组,即在数组末尾再加一次此数组,让首尾相接. 二.出现的问题 判断数组的所有子数组的和的最大值的时候,算法想不清

一组数组中最大字数组之和

1.随机输入数组 2.求出数组之和a 3.用a与数组第一个数开始做和.如果数字小于a,那么舍弃该数:如果大于a,继续计算a与第一个数与第二个数之和,如果小于a舍弃这两个数,如果大于a,继续计算a与第一个数.第二个数.第三个数之和......直到计算的最后一个数为止. 4.与第3步步骤类似,只是从最后一个数开始计算,到第一个数为止. 5.求出最大子数组,输出该字数组数字,以及之和.

结对开发(求二维首尾相接数组的最大子数组和)

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二