二维数组--求最大组数组和

题目:

程序要使用的数组放在一个叫 input.txt 的文件中,文件格式是:

数组的行数,

数组的列数,

每一行的元素, (用逗号分开)

每一个数字都是有符号32位整数,当然,行数和列数都是正整数。

设计思想:

 自己的设计思路是,相邻两行进行加和,给出一个新的数组存储行加和值;然后相邻两列加和,新数组存储列加和值;找出行加和以及列加和最大值,确定中心范围区域,输出行、列第一个值(及中心范围中左上角的值)的数组下标,然后扩大区域,找出最大子数组和的最大值。

但是,自己的设计思路,并没有实现,后询问同学,网上查找,找了一种新的设计思路,利用两层循环,实现题目。

源代码:

package test02;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ErWei {
    public static void main(String[] args) throws IOException {
        
        //构造二维数组
        Integer c[][]= {
            {5,-7,8,6},
            {36,-9,-8,25},
            {-7,8,6,5}
        };
        //求和
        List<List<Integer>> main=new ArrayList<List<Integer>>();
        for(int i=0;i<c.length;i++)
        {
            List<Integer> heng=new ArrayList<Integer>();
            for(int j=0;j<c[0].length;j++)
            {
                if(j!=0)
                    heng.add(c[i][j]+heng.get(j-1));
                else heng.add(c[i][j]);
            }
            if(i!=0)
                main.add(addList(heng,main.get(i-1)));
            else main.add(heng);
        }
        //求最大值
        
        int max=main.get(0).get(0);
        for(int z=0;z<main.size();z++)
        {
            int temp=Collections.max(main.get(z));
            if(max<temp)
            {
                max=temp;
            }
        }
        //确定一位置
        for(int i1=0;i1<main.size();i1++)
        {
            for(int j1=0;j1<main.get(0).size();j1++)
            {
                //确定二位置
                for(int i2=i1+1;i2<main.size();i2++)
                {
                    for(int j2=j1+1;j2<main.get(0).size();j2++)
                    {
                        int g_max=0;
                        if(i1!=0&&j1!=0)
                        {
                            g_max=(main.get(i2).get(j2)+main.get(i1-1).get(j1-1)-main.get(i2).get(j1-1)-main.get(i1-1).get(j2));
                            
                        }
                        else if(i1!=0)
                        {
                            g_max=(main.get(i2).get(j2)-main.get(i1-1).get(j2));
                        }
                        else if(j1!=0)
                        {
                            g_max=(main.get(i2).get(j2)-main.get(i2).get(j1-1));
                        }
                        if(max<g_max)
                        {
                            max=g_max;
                        }
                    }
                }
            }
        }
        System.out.println("该二维数组最大子数组和为:"+max);
    }
    public static List<Integer> addList(List<Integer> a,List<Integer> b)
    {
        List<Integer> sum=new ArrayList<Integer>();
        for(int i=0;i<a.size();i++)
        {
            sum.add(a.get(i)+b.get(i));
        }
        return sum;
    }

}

运行截图:


原文地址:https://www.cnblogs.com/Qi77/p/11062344.html