求二维数组子数组最大和

这个问题是求一维数组最大子数组的进阶版,变成二维了,我先说一下我的思路,没有用到简便算法,就单纯把所有子数组和都求出来,然后求最大值,判断是否为第一行(第一列),如果为第一行(第一列),就直接看另一个不是第一行(第一列)的,控制变量递减求和。然后再求又不是第一行,也不是第一列的,俩个循环嘛,遍历求和。这是一开始的思路,后来发现不对,因为这个只考虑了把第一列作为标准的情况,还有第2列,第三列...,不考虑前面几列的情况,于是我就又加了一个判断条件,控制到第几列停止,最终代码如下:

import java.io.*;
import java.util.Scanner;
public class erwei {
public static void main(String []args)
{
Scanner in=new Scanner(System.in);
int hang;
int lie;
int max;
System.out.print("请输入二维数组行数");
hang=in.nextInt();
System.out.print("请输入二维数组列数");
lie=in.nextInt();
int shuZu[][]=new int[hang][lie];
int length=hang*lie;
int length1=0;
for(int i=0;i<lie;i++)
{
length1+=i;
}
length1*=hang;
int add[][]=new int[lie][length];
for(int i=0;i<lie;i++)
{
for(int j=0;j<length;j++)
{
add[i][j]=0;
}
}
System.out.print("请输入二维数组");
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
shuZu[i][j]=in.nextInt();
}
}



//把每一个子数组的和求出来
for(int k=0;k<lie;k++) {
for(int i=0;i<hang;i++)
{
for(int j=k;j<lie;j++)
{
int i1=i;
int j1=j;
int biaoJi=i*3+j;
if(i!=0)
{
if(j!=k)
{
while(j1>=k)
{
i1=i;
while(i1>=0)
{
add[k][biaoJi]+=shuZu[i1][j1];
i1--;
}
j1--;
}
}
else
{
while(i1>=0)
{
add[k][biaoJi]+=shuZu[i1][j];
i1--;
}
}
}
else
{
if(j!=k)
{
while(j1>=k)
{
add[k][biaoJi]+=shuZu[i][j1];
j1--;
}
}
else
{
add[k][biaoJi]=shuZu[i][j];
}
}
}
}
}


//求子数组和的最大值
max=add[0][0];
for(int i=0;i<lie;i++)
{
for(int j=0;j<length;j++)
{
if(add[i][j]>max)
{
max=add[i][j];
}
}
}

System.out.print(max);


//调用函数存放到文件中去
cunChu(hang,lie,shuZu,max);
}
public static void cunChu(int hang,int lie,int a[][],int max) {
try
{
File file=new File("F:\\大二下java\\erwei.txt");
if(!file.exists())
{
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file,false);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
String stringHang=String.valueOf(hang+"\r\n");
String stringLie=String.valueOf(lie+"\r\n");
String stringMax=String.valueOf(max);
String stringShuZu[][]=new String[hang][lie];
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie-1;j++)
{
stringShuZu[i][j]=String.valueOf(a[i][j]+" ");
}
stringShuZu[i][lie-1]=String.valueOf(a[i][lie-1]+"\r\n");
}
bw.write(stringHang);
bw.write(stringLie);
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
bw.write(stringShuZu[i][j]);
}
}
bw.write(stringMax);
bw.newLine();
bw.flush();
bw.close();
osw.close();
fos.close();
}catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e2)
{
e2.printStackTrace();
}
}

运行截图

 

 当然没有在输入的时候换行

文件截图

 

posted @ 2022-03-22 17:24  听风1234  阅读(38)  评论(0编辑  收藏  举报