数组求和(二)

题目:求一个二维数组中的最大子数组的和

分析:以前做过一个一位数组的求和,现在改为二维数组,复杂了很多,但基本思想不变。经过几天的讨论,与程序的修改,实现了题目的要求。源代码如下:

package com.su.test;
       public class Hellosu {
    public static void main(String[] args)
    {
         //测试用例
      int b[][]={{3,4,-7},{7,2,0},{-11,3,0}};
      int max=maxSubMatrix(b,b.length,b[0].length);
      System.out.println(max); 
    }
    public static  int maxSubArray(int ar[],int n)    //一维数组最大子数组
    {
        int max=ar[0];
        int k[]=new int[3];
        int b=ar[0];
        int i;
        for(i=1;i<n;i++)
        {
           if(b>0)
           {
               b+=ar[i];  
           }
           else
           {
               b=ar[i];
           }
            
           if(b>max)
           {
               max=b;
           }
        }  
        return max;
    }
    public static  int maxSubMatrix(int p[][],int m,int n)    //二维数组最大子矩阵
    {
          int i,j,k,max=p[0][0],tempt;
         //记录每行的和
         int last_i=0,last_j=0;
         int sum[]=new int[m];
        for(i=0;i<n;i++)
       {
            for(k=0;k<m;k++)
             sum[k]=0;
                 for(j=i;j<n;j++)
                {
                    for(k=0;k<m;k++)
                   {
                     sum[k]+=p[k][j];
                   }
                    tempt=maxSubArray(sum,m);
                    if(tempt>max)
                    {
                     last_i=i;
                     last_j=j;
                     max=tempt;
                    }
                }
            }
          System.out.println("从第"+(last_i+1)+"列开始,到第"+(last_j+1)+"结束");
      return max;
    }
 }
总结:结对开发是我们练习的重点,主要是形成一个习惯:能设计算法,并且具有可读性;能找出别人写的代码中的错误,或者能简化程序代码。

 

posted @ 2014-03-19 17:14  逍遥丶小哥  阅读(122)  评论(0编辑  收藏  举报