首页 > 其他 > 详细

[软件工程学习笔记]结对作业---二维数组求最大子矩阵

时间:2014-03-19 22:04:32      阅读:313      评论:0      收藏:0      [点我收藏+]

      结对成员  张永  吴盈盈

      本次结对作业和上一次在数组中求最大子数组的作业类似,只是把难度加到了二维。这次我们在课上没有再去考虑一开始的穷举的思想,而是按照上一题动态规划的思路继续推广到二维数组。

      我们将每一列都看为是一个元素,这样可以将二维数组看做一个一维数组,设一列中其实的行的为s,结尾的行为e,假设这个数组为B,则B[j]=array[s][j]+....+array[e][j]

       其间的部分和就是PSum[e][j]-PartSum[s-1][j]-PSum[e][j-1]+PSum[e-1][j-1],行列都确定下来可以求出部分和再对部分和进行比较。

 

bubuko.com,布布扣

      很遗憾这种算法我们没能自己写出来,参考了网上了一段代码贴在下面。

 

bubuko.com,布布扣
#include <iostream>  
using namespace std;    
#define N 5  
#define M 4  
  
int Sum(int (*PSum)[M+1],int istart,int iend,int j) //istart--iend第j列的和  
{  
    int pSum;  
    pSum=PSum[iend][j]-PSum[istart-1][j]-PSum[iend][j-1]+PSum[istart-1][j-1];  
    return pSum;  
}  
  
//求二维数组的连续子数组之和的最大值  
int MaxSum(int (*a)[M])  
{  
    int PSum[N+1][M+1];  
    int i,j;  
    for(i=0;i<=N;i++)  
        PSum[i][0]=0;  
    for(j=0;j<=M;j++)  
        PSum[0][j]=0;  
    for(i=1;i<=N;i++)  
        for(j=1;j<=M;j++)  
            PSum[i][j]=PSum[i-1][j]+PSum[i][j-1]-PSum[i-1][j-1]+a[i-1][j-1];  
    int MaxSum=INT_MIN;  
    int Start,All;  
    int istart,iend;  
    for(istart=1;istart<=N;istart++)  
    {  
        for(iend=istart;iend<=N;iend++)  
        {  
            Start=Sum(PSum,istart,iend,M);  
            All=Sum(PSum,istart,iend,M);  
            for(j=M-1;j>=1;j--)  
            {  
                if(Start>0)  
                    Start+=Sum(PSum,istart,iend,j);  
                else  
                    Start=Sum(PSum,istart,iend,j);  
                if(Start>All)  
                    All=Start;  
            }  
            if(All>MaxSum)  
                MaxSum=All;  
        }  
    }  
    return MaxSum;  
}  
  
  
int main()  
{  
   int a[N][M]={  
        1,2,3,8,  
        4,0,-2,11,  
        -8,2,2,2,  
        9,3,-4,5,
        5,4,-4,3
    }; 
    int maxSum=MaxSum(a); 
    cout<<maxSum<<endl;  
    getchar();  
  
    return 0;  
}  
bubuko.com,布布扣

 

参考下涨涨姿势吧。

[软件工程学习笔记]结对作业---二维数组求最大子矩阵,布布扣,bubuko.com

[软件工程学习笔记]结对作业---二维数组求最大子矩阵

原文:http://www.cnblogs.com/wingwyy511/p/3612077.html

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