二维数组循环求出最大子数组

package shengcheng;

import java.util.Scanner;

import org.junit.Test;

public class ErweiXunhuan {

@Test
public void fun()
{
    int [][]a=new int[4][8];
    Scanner write=new Scanner(System.in);
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            a[i][j]=write.nextInt();
            a[i][j+4]=a[i][j];
        }
    }

    int  max=-200000;
    int []sum=new int [8];

    int  add =-200000 ;
    for(int i=0;i<4;i++)
    {
        for(int l=0;l<8;l++)
        {
            sum[l]=0;
        }
        for(int j=i;j<4;j++)
        {

            for(int k=0;k<8;k++)
            {
                sum[k]+=a[j][k];
            }

                add=DP(sum,4);
            }

        if(add>max)
        {
            max=add;
        }

    }
    System.out.println(max);

}

 public  int DP(int  a[],int n)
 {

     int  Max=a[0];
     int temp=-200000;
     for(int i=0;i<n;i++)
        {
           temp=-200000;
           for(int j=i;j<n+i;j++)
           {

             temp+=a[j];
             if(temp>Max)
             {
                 Max=temp;
             }

             if(temp<0)
             {
                 temp=a[j];
             }

           }
        }
     return Max;
      }

}

  老师出了这道题目的时候,我首先联想到原来的一维数组循环求最大子矩阵,然后还想到原来的二维数组求最大子矩阵,感觉可以利用原来的思路继续思考下去,于是我就想原来的二维数组的求最大的子矩阵也是将二维转化为一维的,然后再将一维的数组进行动态规划,这样就解决原来二维的问题,于是我就用相同的方法将二维的的列数扩大一倍这样就起到循环的目的,然后将这个二维数组再转化为一维数组,然后这样就能利用上原来的一维循环数组就这样可以解决了问题。

时间: 2024-10-07 04:50:43

二维数组循环求出最大子数组的相关文章

一维循环的数组求出最大子数组的和

题目是:一维循环的数组求出最大子数组的和 老师刚给出这个题目时 ,求出一维子数组的最大子数组的和,当时我就想原来已经做过一个求出一维数组的最大子数组的和,能不能在此基础上延伸一下,于是我就想怎样利用原来的算法,后来我就想既然是还是求出最大子数组的和肯定原来的东西可以利用. 我想既然是循环,无外乎就是这个数组进行两遍,所以我感觉这样就可以再在这个数组后面申请一个和它长度相同,数的大小和顺序和它一样的数组,这样就起到了循环的目的,于是我就这样进行了,然后再调用原来的方法,这样就可以求出最大子数组的值

求最大子数组的和,以及求该最大子数组的起始位置和末尾位置

问题描述: 一个数组,长度为N,数组元素有负有正,如{-1, 4, 6, -3, 7, -3, -3, 9}:我们可以清楚的知道最大的子数组应该是4到9,也就是下标1到下标7,和为17. 求解思路: 第一种方法:我们可以用定义1.两个数ThisSum和MaxSum来记录当前数组的和,以及数组的最大和. 2.我们可以用两个for循环来来遍历数组,每一次求出子数组的最大和,每个子数组从0开始,下一次遍历子数组就是从1开始,以此类推.如第一次就[0~N-1]的最大和,第二次就是[1~N-1],第三次就

求一个最大子数组的和 Ⅲ

要求: • 输入一个整形数组,数组里有正数也有负数. • 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. • 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. • 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思路:核心算法同求一个最大子数组的和Ⅱ相同,将所有数组一遍循环改为无限循环,只需选一个时间跳出即可. 具体代码如下: 1 public static void m

二维数组循环求最大子数组

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.源代码 #include<iostream.h> int main() {  int x,y,n,m;  int s[10][20];  int sum[10][20]; cout<<"请输入3行4列的矩

2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标

PS:这篇是之前本来就想发的但是一直没时间写,加上今天做了京东的题,结果代码名就命名为jingdong了--懒得改代码名重新跑一遍结果了=.= 暴力法去做就是遍历每个点,判断它是不是"最大点".判断过程则是又遍历一遍,看看是否存在其他点在它右上方,若存在则不是最大点.O(N^2) 但是这样就会有很多不必要的计算,举个例子(这里暂且当坐标都是int),若存在一个最大点(x0,y0),那么所有在它左下角的点都不用考虑了. 另外,对于(x0,y0),只需要查找在它右边(x>x0)的点是

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积,

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>二维数组</title><script type="text/javascript">var myarr = new Array(); for (var i = 1

ThoughtWorks.QRCode 生成QR二维码时提示“索引超出了数组界限”的原因和解决方法

"索引超出了数组界限"也有可能确实是因为你选择的二维码Version对应的容量不足以存储你所放的内容,如果你确定使用的版本容量二维码能存储你的内容,但还是报错,那么再考虑此解决方法 这两天忙着做一个客户标签打印程序,因为二维码里面存在控制符,使用ZPL指令存在一些问题,因此决定使用生成二维码图片然后转换成ZPL格式图片来打印.途中找了很多类库,很多都无法自定义QR的version而放弃,转而找到ThoughtWorks.QRCode.dll,效果很满意,但是测试的时候发现经常会提示&q

HDU1832 二维线段树求最值(模板)

Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 50 Accepted Submission(s): 20   Problem Description 世界上上最远的距离不是相隔天涯海角而是我在你面前可你却不知道我爱你                ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘

海报二维码识别不出,生成带参数二维码功能

生成海报二维码,可以统计通过这个二维码进来的粉丝 利用公众号提供的渠道二维码编写源码,生成二维码 use Endroid\QrCode\QrCode; //支持文字.链接 $content = '微号帮参数二维码功能' . rand(1000, 9999); $qrCode = new QrCode($content); // 指定内容类型 header('Content-Type: '.$qrCode->getContentType()); // 输出二维码 echo $qrCode->wr