个人作业3

       这次换成了二维数组,用时大概2个小时。课上老师也讲了许多思路,但不知道如何实施。自己开始也有个思路,也是在执行上遇到了问题,最后也就是在昨天在百度上找了找思路,但绝对不是抄袭,于是乎也就按照百度的提醒将二维数组进行分块后将各个分块的和放进另一个二维数组里,以后就是我自己的思路了,首先,我将原二维数组中的最大值赋给maxsum(最大子数组的和),后来也就是将新二维数组与maxsum比较,最后求得的maxsum就是最大子数组的和。

       源代码如下:

       

package test;

import java.util.Scanner;



public class Test {
	public static int getMaxSum(int [][]a, int m, int n) {
		
		//将二维数组分块
		int[][]p=new int[m][n];
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				if(i==0) {
					if(j==0)
						p[i][j]=a[i][j];
					else
						p[i][j]=p[i][j-1]+a[i][j];
				}
				else {
					if(j==0)
						p[i][j]=p[i-1][j]+a[i][j];
					else
						p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
				}	
			}
		}
		
		//求块的最大值
		//先求出原数组的最大值max
		int max=a[0][0];
		for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
				if(a[i][j]>max)
					max=a[i][j];
			}
		}
			
		int maxsum=max;
		
		for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
				if(p[i][j]>maxsum)
					maxsum=p[i][j];
			}
		}
		
		return maxsum;
	}

	
      
	public static void main(String args[]) {
		
				int m,n;
				System.out.println("请依次输入数组的行数和列数:");
				@SuppressWarnings("resource")
				Scanner scanner=new Scanner(System.in);
				m=scanner.nextInt();
				n=scanner.nextInt();
				int[][] a = new int[m][n];
				System.out.println("请依次输入"+m+"×"+n+"个数");
				//输入数组
				for(int i=0;i<m;i++) {
					for(int j=0;j<n;j++) {
						a[i][j]=scanner.nextInt();
					}			
				}
//				//输出数组
//				for(int i=0;i<m;i++) {
//					for(int j=0;j<n;j++) {
//						System.out.print(a[i][j]+" ");
//					}			
//				}
				System.out.println("最大子数组和为:"+getMaxSum(a,m,n));
		}
}						
				
				
				
		
	

  这次的总结就是:一定要自己多动手尝试,实在不行呢就去找思路,但不能直接抄袭代码,思路明确后代码要靠自己实现。

猜你喜欢

转载自www.cnblogs.com/qianmo123/p/10582435.html