• 最大子矩阵


        2、最大子矩阵和问题
            (1)问题描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,时期各元素之和为最大。

         (2)问题分析:

          用二维数组a[1:m][1:n]表示给定的m行n列的整数矩阵。子数组a[i1:i2][j1:j2]表示左上角和右下角行列坐标分别为(i1,j1)和(i2,j2)的子矩阵,其各元素之和记为:

          最大子矩阵问题的最优值为。如果用直接枚举的方法解最大子矩阵和问题,需要O(m^2n^2)时间。注意到,式中,,设,则

    容易看出,这正是一维情形的最大子段和问题。因此,借助最大子段和问题的动态规划算法MaxSum,可设计出最大子矩阵和动态规划算法如下:

    //3d4-5 最大子矩阵之和问题
    #include "stdafx.h"
    #include <iostream> 
    using namespace std; 
    
    const int M=4;
    const int N=3;
    
    int MaxSum(int n,int *a);
    int MaxSum2(int m,int n,int a[M][N]);
    
    int main()
    {
        int a[][N] = {{4,-2,9},{-1,3,8},{-6,7,6},{0,9,-5}};
    
        for(int i=0; i<M; i++)
        {
            for(int j=0; j<N; j++)
            {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
    
        cout<<endl;
        cout<<"数组a的最大连续子段和为:"<<MaxSum2(M,N,a)<<endl;
    
        return 0;
    }
    
    int MaxSum2(int m,int n,int a[M][N])
    {
        int sum = 0;
        int *b = new int[n+1];
        for(int i=0; i<m; i++)//枚举行
        {
            for(int k=0; k<n;k++)
            {
                b[k]=0;
            }
    
            for(int j=i;j<m;j++)//枚举初始行i,结束行j
            {
                for(int k=0; k<n; k++)
                {
                    b[k] += a[j][k];//b[k]为纵向列之和
                    int max = MaxSum(n,b);
                    if(max>sum)
                    {
                        sum = max;
                    }
                }
            }
        }
        return sum;
    }
    
    int MaxSum(int n,int *a)
    {
        int sum=0,b=0;
        for(int i=1; i<=n; i++)
        {
            if(b>0)
            {
                b+=a[i];
            }
            else
            {
                b=a[i];
            }
            if(b>sum)
            {
                sum = b;
            }
        }
        return sum;
    }
  • 相关阅读:
    Java学习开篇
    《我的姐姐》
    世上本无事,庸人自扰之
    这48小时
    补觉
    淡定
    es java api 设置index mapping 报错 mapping source must be pairs of fieldnames and properties definition.
    java mongodb groupby分组查询
    linux 常用命令
    mongodb too many users are authenticated
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7520196.html
Copyright © 2020-2023  润新知