zoukankan      html  css  js  c++  java
  • 求数组的所有子数组的和的最大值(二维)

    组员:蔡容玉 张丹丹

    题目:求数组的所有子数组的和的最大值(二维)

    思路:首先我们考虑的是最直接最简单的穷举法,然后又考虑了老师提出的找最大正数(优先)或最小负数(排除)方法,但是考虑到这个方法可能出错,于是我们便参考资料,想到了另一种方法:枚举法

        把二维的问题化成一维的问题,首先我们知道某子矩阵的上,下边界分别是a行和b行,接下来我们应该要确定左右边界;把a行和b行之间的每一列看作是一个整体,定义为:DC[1],DC[2],DC[3],……DC[M],把他们看作一个元素并求出最大值;这样就把二维问题转化为一维问题。另外,二维情况下我们定义部分和:PS[i][j] 等于以(1,1)、(i,1)、(1,j)、(i,j)为顶点的矩形区域的元素之和。

    源代码:

    复制代码
    #include<iostream>
    using namespace std;
    #define max(a,b)  (((a)>=(b))?(a):(b))
    int DC(int **PS,int a,int c,int i)
    {
        return PS[c][i]-PS[c][i-1]-PS[a-1][i]+PS[a-1][i-1];
    }
    int main()
    {
        int Start,All;
        int m,n;
        int i,j;
        int **PS;
        int **A;
        int a,c;
        int maxnum=-1;
        cout<<"请输入行数:";
        cin>>n;
        cout<<"请输入列数:";
        cin>>m;
        PS=(int **)malloc(sizeof(int*)*(n+1));
        A=(int **)malloc(sizeof(int*)*(n+1));
        for (i=0;i<=n;i++)
        {
            PS[i]=(int *)malloc(sizeof(int)*(m+1));
            A[i]=(int *)malloc(sizeof(int)*(m+1));
        }
        cout<<"请输入"<<n<<""<<m<<"列数字:"<<endl;
        for (i=1;i<=n;i++)
        {
            for (j=1;j<=m;j++)
            {
                cin>>A[i][j];
            }
        }
        //求部分和
        for (i=0;i<=n;i++)
        {
            PS[i][0]=0;
        }
        for (j=0;j<=m;j++)
        {
            PS[0][j]=0;
        }
        for (i=1;i<=n;i++)
        {
            for (j=1;j<=m;j++)
            {
                PS[i][j]=A[i][j]+PS[i][j-1]+PS[i-1][j]-PS[i-1][j-1];
            }
        }
        //枚举求出问题的解
        for (a=1;a<=n;a++)
        {
            for (c=a;c<=n;c++)
            {
                Start=DC(PS,a,c,m);
                All=DC(PS,a,c,m);
                for (i=m-1;i>=1;i--)
                {
                    Start=max(DC(PS,a,c,i),DC(PS,a,c,i)+Start);
                    All=max(Start,All);
                    if (All>maxnum)
                    {
                        maxnum=All;
                    }
                }
            }
        }
        cout<<maxnum<<endl;
        return 0;
    }
    复制代码

    运行结果:

    以上!谢谢!

  • 相关阅读:
    Martix工作室考核题 —— 打印一个菱形
    Martix工作室考核题 —— 打印一个菱形
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第一题
    fiddler模拟发送post请求
  • 原文地址:https://www.cnblogs.com/hfxdaj/p/3612201.html
Copyright © 2011-2022 走看看