首页 > 编程语言 > 详细

二维数组最大子数组和

时间:2015-04-08 21:30:56      阅读:222      评论:0      收藏:0      [点我收藏+]
技术分享
#include<iostream>
#define N 5
using namespace std;

int main()
{
    int a[4][5]={1,2,-1,-4,-20,-8,-3,4,2,1,3,8,10,1,3,-4,-1,1,7,-6},i,j;
    for(i=0;i<N-1;i++)
    {
        for(j=0;j<N;j++)
        {cout<<a[i][j]<<"  ";}
        cout<<endl;
    }cout<<endl;///////////////////////////////////数组输出

    int sum=a[0][0],b,c[N];
    int imin=0,imax=0,jmin=0,jmax=0;

    for(i=0;i<N;i++)
        c[i]=a[0][i];
    for(i=1;i<=4;i++)
    {
        b=c[0];
        for(int j=1;j<N;j++)  
        {  
            if(b<0)          
            { b=c[j];jmin=j;}  
            else  
                b+=c[j];  
            if(sum<=b) 
            { sum=b;jmax=j;}  
        } 

        if(i<N-1)
        {
        if(b<0)
        {
            for(int j=0;j<N;j++)
            {c[j]=a[i][j];imin=i;}
        }
        else
        {
            for(int j=0;j<N;j++)
            {
                c[j]+=a[i][j];
                imax=i;
            }
        }
        }
    }
    for(i=imin;i<=imax;i++)
    {
        for(j=jmin;j<=jmax;j++)
        {cout<<a[i][j]<<"  ";}
        cout<<endl;
    }cout<<endl;
    cout<<sum<<endl;

}

思路:把每行看成一维数组来做,先求第一行的最大子数组的和,赋值给b,然后加上第二行变成一个新的一维数组,继续求和,若和b大于sum,则sum更新,若b小于0则舍弃该行,im,in等于i,接下来继续加上第三行,以此类推,直到加到最后一行。

感受:难,还是不能够找到很好的思路,虽然从网上百度到了,但可能还有瑕疵,对于b小于0的判断可能还有问题。

成员:宋雨佳,周雪莹

技术分享

二维数组最大子数组和

原文:http://www.cnblogs.com/xiangwo/p/4403612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!