zoukankan      html  css  js  c++  java
  • 求二维数组最大子数组之和(不能运行)

    上星期做了关于一维数组的子数组最大和求值问题。但是相对于二维数组来说复杂了好多。

    对于这个程序,没能运行出来,有点遗憾,但是有一些思想还是可以实现的。

    我们可以先求子矩阵的部分和,利用已经求出的部分和,来解出当前要求的矩阵的部分和,
    定义一个部分和数组PartSum,其中PartSum[i][[j]代表了下标(0,0),(0,j),(i,0),(i,j)包围的区间的和。
    求PSum部分和数组了

    nt 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]-P[i-1][j-1]+array[i-1][j-1];  
    1. 之后就是求二维数组的连续子数组之和的最大值  
    1. int MaxSum(int (*array)[N])  
    2. {  
    3.     int PartSum[N+1][M+1];  
    4.     int i,j;  
    5.     for(i=0;i<=N;i++)  
    6.         PartSum[i][0]=0;  
    7.     for(j=0;j<=M;j++)  
    8.         PartSum[0][j]=0;  
    9.     for(i=1;i<=N;i++)  
    10.         for(j=1;j<=M;j++)  
    11.             PartSum[i][j]=PartSum[i-1][j]+PartSum[i][j-1]-PartSum[i-1][j-1]+array[i-1][j-1];  
    12.     int MaxSum=-INFINITY;//初始化  
    13.     int imin,imax,jmin,jmax;  
    14.     for(imin=1;imin<=N;imin++)  
    15.         for(imax=imin;imax<=N;imax++)  
    16.             for(jmin=1;jmin<=M;jmin++)  
    17.                 for(jmax=jmin;jmax<=M;jmax++)  
    18.                         MaxSum=MaxNum(MaxSum,PartSum[imax][jmax]-PartSum[imin-1][jmax]-PartSum[imax][jmin-1]+PartSum[imin-1][jmin-1]);  
    19.                           
    20.     return MaxSum;  

    // MaxMatrix.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <iostream>
    #include <limits>
    using namespace std;

    #define N 4
    #define M 3

    int BC(int (*PartSum)[M+1],int imin,int imax,int j) //imin--imax第j列的和
    {
    int value;
    value=PartSum[imax][j]-PartSum[imin-1][j]-PartSum[imax][j-1]+PartSum[imin-1][j-1];
    return value;
    }

    //求二维数组的连续子数组之和的最大值
    int MaxSum(int (*array)[M])
    {
    int PartSum[N+1][M+1];
    int i,j;
    for(i=0;i<=N;i++)
    PartSum[i][0]=0;
    for(j=0;j<=M;j++)
    PartSum[0][j]=0;
    for(i=1;i<=N;i++)
    for(j=1;j<=M;j++)
    PartSum[i][j]=PartSum[i-1][j]+PartSum[i][j-1]-PartSum[i-1][j-1]+array[i-1][j-1];
    int MaxSum=INT_MIN;
    int Start,All;
    int imin,imax;
    for(imin=1;imin<=N;imin++)
    {
    for(imax=imin;imax<=N;imax++)
    {
    Start=BC(PartSum,imin,imax,M);
    All=BC(PartSum,imin,imax,M);
    for(j=M-1;j>=1;j--)
    {
    if(Start>0)
    Start+=BC(PartSum,imin,imax,j);
    else
    Start=BC(PartSum,imin,imax,j);
    if(Start>All)
    All=Start;
    }
    if(All>MaxSum)
    MaxSum=All;
    }
    }
    return MaxSum;
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
    int a[N][M]={
    1,2,3,
    4,0,-2,
    -8,2,2,
    9,3,-4
    };
    int maxSum=MaxSum(a);
    cout<<maxSum<<endl;
    getchar();

    return 0;

    下面是课堂上讨论时的笔记;
    }

  • 相关阅读:
    VS中添加搜索路径和链接库的方法
    hive多分隔符支持
    shell 遍历目录下的所有文件
    使用ansible控制Hadoop服务的启动和停止【转】
    Shell中的括号有其特殊的用法
    shell中括号[]的特殊用法 linux if多条件判断
    Linux中rz和sz命令用法详解
    vim 去掉自动注释和自动回车
    ping判断局域网ip使用情况
    shell判断有效日期
  • 原文地址:https://www.cnblogs.com/dongfangjian/p/3612289.html
Copyright © 2011-2022 走看看