返回一个二维整数数组中最大联通子数组的和

题目:

  返回一个二维整数数组中最大子数组的和。

要求:

  输入一个二维整型数组,数组里有正数也有负数。

  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  求所有子数组的和的最大值。要求时间复杂度为O(n)。

  结对编程要求: 两人结对完成编程任务。

  一人主要负责程序分析,代码编程。

  一人负责代码复审和代码测试计划。

思路:

  本次试验我们是在上次试验的基础上,还是利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。不过缺陷是这样时间花费比较多,而且我们没有用文件来实现,只是在程序中输入输出。

设计代码:

 

#include <iostream.h> 
int maxSubArray(int **a,int n,int m) 
{ 
    int **p=new int*[n]; 
    int i,j; 
    if(m==0||n==0) 
        return 0; 
    //计算p[i][j]     
    for(i=0;i<n;i++) 
    { 
        p[i]=new int[m]; 
        for(j=0;j<m;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]; 
            } 
        } 
    } 
    //计算二维数组最大子数组的和 
    int temp; 
    int max=a[0][0];//初始化 
    int sum; 
    if(m==1) 
    { 
        for(i=0;i<n;i++) 
        { 
            for(j=i;j<n;j++) 
            { 
                if(i==0) 
                { 
                    temp=p[j][m-1]; 
                } 
                else
                { 
                    temp=p[j][m-1]-p[i-1][m-1]; 
                } 
                if(sum<temp) 
                    sum=temp; 
            } 
        } 
    } 
    else
    { 
        for(i=0;i<n;i++) 
        { 
            for(j=i;j<n;j++) 
            { 
                if(i==0) 
                { 
                    temp=p[j][m-1]-p[j][m-2]; 
                } 
                else
                { 
                    temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2]; 
                } 
                for(int k=m-2;k>=0;k--) 
                { 
                    if(temp<0) 
                        temp=0; 
                    if(i==0) 
                    { 
                        if(k==0) 
                            temp+=p[j][k]; 
                        else
                            temp+=p[j][k]-p[j][k-1]; 
                    } 
                    else
                    { 
                        if(k==0) 
                            temp+=p[j][k]-p[i-1][k]; 
                        else
                            temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; 
                    } 
                    if(sum<temp) 
                        sum=temp; 
                } 
            } 
        } 
    } 
    return sum; 
} 
  
int main() 
{ 
    int n;//行数 
    int    m;//列数 
    cout<<"请输入二维数组的行数:"<<endl; 
    cin>>n; 
    cout<<"请输入二维数组的列数"<<endl; 
    cin>>m; 
    int i,j; 
    int **a=new int*[n]; 
    cout<<"请输入该二维数组元素:"<<endl; 
    for(i=0;i<n;i++) 
    { 
        a[i]=new int[m]; 
          
        for(j=0;j<m;j++) 
        { 
            cin>>a[i][j]; 
        } 
    } 
    int sum;//最大字数组的和  
    sum=maxSubArray(a,n,m); 
    cout<<"二维数组的最大子数组之和:"<<sum<<endl; 
    return 0; 
} 

 

实验截图:

 

posted @ 2015-04-06 12:51  神奇的匹诺曹  阅读(149)  评论(0)    收藏  举报