二维数组最大联通子数组和
1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值。
2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚。
3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出;当列数为1时,当成一维计算;
4.源代码:
/*返回一个整数数组中最大子数组的和。 输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。*/ package shuzumax; import java.util.Scanner; public class shuzuu { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入二维数组的行和列:"); int hang=scanner.nextInt(); int lie=scanner.nextInt(); int[][] shuzu=new int[hang][lie]; int i,j; for(i=0;i<hang;i++) { for(j=0;j<lie;j++) { shuzu[i][j]=scanner.nextInt(); } } System.out.println("此数组中连续和的最大值为:"+max(shuzu,hang,lie)); } static int max(int shuzu[][],int hang,int lie) { int max=0,sum=0; int i,j; int[] b=new int[lie]; int[] up=new int[hang]; int[] down=new int[hang]; int[] t=new int[hang]; if(lie==1) { for (i=0;i<hang;i++) { sum+=shuzu[i][0]; if(sum<0) { sum=0; } if(sum>max) { max=sum; } } if(max==0) { for(i=0;i<hang;i++) { if(i==0) { max=shuzu[i][0]; } if(shuzu[i][0]>max) { max=shuzu[i][0]; } } } } else { for(i=0;i<hang;i++) { for(j=0;j<lie;j++) { b[j]=shuzu[i][j]; } int[] c=new int[100]; c[0]=0; int sum1=0,max1=0,k; for(k=0;k<lie;k++) { if(sum1<0) { sum1=b[k]; } else { sum1=sum1+b[k]; } c[k]=sum1; } max1=c[0]; int mmark=0,smark=0; for(k=0;k<lie;k++) { if (max1<c[k]) { max1= c[k]; mmark = k; } } for (k = mmark;k >= 0;k--) { if (c[k] == b[k]) { smark = k; break; } } sum=max1; up[i]=smark; down[i]=mmark; t[i]=sum; } int t2=t[0]; for(i=0;i<hang-1;i++) { if(up[i]<=down[i+1] && down[i]>=up[i+1]) { t2+=t[i+1]; } for(j=up[i];j<up[i+1];j++) { if(shuzu[i+1][j]>0) t2+=shuzu[i+1][j]; //判别独立正数 } } max=t2; } return max; } }
5.截图:
6.总结:通过这次的实验,我觉得我对二维数组理解的还不够深入,对于问题要一层层的剖析,将问题简单化,才能进步。