拿到这个题,总是想着一部解决问题,结果越想越乱,越想越头疼。
一开始我想的是,将二维数组转化为一维数组,但是逻辑不通,基本就不可能实现,之后也就放弃了。
设计思想:
首先需要确定计算出所有子数组,再求最大子数组;
那么问题就来了:如何确定子数组呢?课上也是受到老师的点播:
确定子数组:只需确定左上角与右下角数据坐标便可;
之后就可以计算在确定区间里数据的和了。
源代码:
import java.util.List; import java.util.Scanner; import java.util.*; import java.util.Scanner; import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.FileOutputStream; import java.lang.Math; import java.io.IOException; public class ErJie { public static void main(String[] args) { //定义 int[][] str=new int[100][100];//主体 int[] str1=new int [100];//每一个的串值 //规定长与宽 System.out.println("请输入长,宽:"); int a=0;//总数 int b=0; Scanner scan=new Scanner(System.in); a=scan.nextInt(); b=scan.nextInt(); //输入值 System.out.println("请输入值:"); for(int i=0;i<a;i++) { for(int j=0;j<b;j++) {int s1; s1=scan.nextInt(); str[i][j]=s1;} }int l=0; //输出 for(int i=0;i<a;i++) { for(int j=0;j<b;j++) System.out.println("("+(i+1)+", "+(j+1)+")是:"+str[i][j]); } //代码实现 int Q=0;int M=0; for(int i=0;i<a;i++) {//一共一行到a行 Q=Q+1;//几块进行运算(2 4 。。) int O=0; for(int n=i;n<a;n++) {//每一行 O=O+1;//每一行就是对一维的下移 for(int j=0;j<b;j++) {//每一个 int P=0;//每一个小组合的第一个 for(int m=j;m<b;m++) {//从j加到最后 int a1=str[i][j]; for(int x=i;x<=n;x++) { for(int y=j;y<=m;y++) { a1=str[x][y]+a1; } } str1[M]=a1-str[i][j]; M=M+1; } } } } int x=str1[0]; for(int i=0;i<M;i++) { if(str1[i]>x)x=str1[i]; } System.out.println(x);