• 求数组的所有子数组的和的最大值(二维)


    组员:蔡容玉 张丹丹

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

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

        把二维的问题化成一维的问题,首先我们知道某子矩阵的上,下边界分别是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;
    }

    运行结果:

    以上!谢谢!

  • 相关阅读:
    vim删除操作
    kubectl命令自动补全
    kubelet资源限制
    一道c语言运算符优先级问题
    c语言自加自减三道题
    C语言操作符优先级
    [word]2010中插入公式自动编号并且公式不自动缩小/变小
    [matlab]改变矩阵的大小并保存到txt文件
    dxut.h(29): fatal error C1083: Cannot open include file: 'dxsdkver.h': No such file or directory
    [vim]的关键字补全
  • 原文地址:https://www.cnblogs.com/cairongyu/p/3611771.html
Copyright © 2020-2023  润新知