• 返回一个二维整数数组的最大子数组的和


    设计思路:

    首先了解一维数组的求最大和,可以先列举出一维数组的所有子数组并求出他们的和,即加上一个正的和会增加,反之减少,如果某一个和为负数,那么就应该放弃他,然后清零。然后求二维数组最大子数组的和,可以转化为求一维数组最大子数组的和
    设一个二维数组a[n][m],找它的 最大子数组之和,先建立一个新的二维数组b[n][m],二维数组b[j][k] 存放的是a[j][k](0<=j2.循环:从a[0][0]开始 以此是 a[0][1]、 a[0][2]……a[0][m]、a[1][0]、 a[1][1]……a[1][m]、a[2][0]、 a[2][1]……a[2][m]、……a[n][0]、 a[n][1]……a[n][m],当循环到a[j][k](0<=j计算方法:根据b[j-1][k]、b[j][k-1]、b[j-1][k-1]的正负情况,来计算b[j][k],根据包含a[j][k]的各种矩阵情况,求得最大值,最后求出b[m][n]中的最大值。

    设计程序:(参考网上部分前辈们的部分代码框架和设计思路)

    int a[102][102];
    int maxSubArray(int *arr, int len)
    {
    int i,sum=arr[0],b=0;
    for(i=0;i<len;++i)
    {
    if(b>0)
    b+=arr[i];
    else
    b=arr[i];
    if(b>sum)
    sum=b;
    }
    return sum;
    }
    int maxSubMatrix(int n, int m,int array[102][102])
    {
    int i,j,h,max,sum=-100000;
    int b[102];
    for(i=0;i<n;i++)
    {
    memset(b,0,sizeof(b));
    for(j=i;j<n;j++)
    {
    for(h=0;h<m;h++)
    {
    b[h]+=array[j][h];
    }
    max=maxSubArray(b,h);
    if(max>sum)
    sum=max;
    }
    }
    return sum;
    }
    int main(void)
    {
    int n,i,j;
    while(scanf("%d",&n)!=EOF)
    {
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    scanf("%d",&a[i][j]);
    }
    printf("%d ",maxSubMatrix(n,n,a));
    }
    return 0;
    }

    总结:

    周泊辰主要负责程序分析,代码编程。张子涵主要负责代码测试计划,这个作业难度过于大,调试测试的过程中,出现和很大的问题,最后运行结果的时候仍出现了一点小问题,仍然不知道怎么解决,这个过程中参考部分前辈们的部分内容,敬请谅解

  • 相关阅读:
    Leetcode 18. 4Sum
    Leetcode 15. 3Sum
    Leetcode 16. 3Sum Closest
    String类型的理解
    求字符串中某个字符出现的次数
    用StringBuilder来实现经典的反转问题
    String/StringBuilder 类 用对象数组实现登录注册功能
    String/StringBuilder 类 统计字符串中字符出现的次数
    String/StringBuilder 类 判断QQ号码
    C++ 面向对象: I/O对象的应用
  • 原文地址:https://www.cnblogs.com/amnavov/p/9825865.html
Copyright © 2020-2023  润新知