• 二维数组求子数组中最大的和


        上次的课堂编程题目是一维数组中子数组的和,现在难度加大了不少,二维数组需要考虑的方面很多,这个程序我是在上个课堂题目基础上加以改善完成的,核心代码如下:

    int maxSubArray(int a[], int n)
    
    {
    
        assert(a!=NULL && n>0);
    
        int cur = 0;
    
        int max = INF;
    
     
    
        for(int i=0; i<n; i++)
    
        {
    
            cur += a[i];
    
     
    
            //当cur小于0时,应该重新开始计数.
    
            if(cur < 0)
    
                cur = 0;
    
     
    
            if(cur > max)
    
                max = cur;
    
        }
    
        return max;
    
    }
    
     
    
    int findMaxSubMatrix(int a[][N], int n)
    
    {
    
        int tmpSum[N];
    
        int max = INF;
    
     
    
        //枚举所有行的可能组合。
    
        for(int i=0; i<n; i++)
    
        {
    
            //将tmpSum清零。
    
            memset(tmpSum,0,sizeof(tmpSum));
    
            for(int j=i; j<n; j++)
    
            {
    
                //加上当前行的元素。
    
                for(int k=0; k<n; k++)
    
                    tmpSum[k] += a[j][k];
    
                int tmpMax = maxSubArray(tmpSum, n);
    
                if(tmpMax > max)
    
                    max = tmpMax;
    
     
    
            }
    
        }
    
        return max;
    
    }
    
     
    
    int main()
    
    {
    
        int a[N][N];
    
        int n = 0;
    
     
    
        while(cin>>n && n)
    
        {
    
            for(int i=0; i<n; i++)
    
                for(int j=0; j<n; j++)
    
                    cin>>a[i][j];
    
            cout<<findMaxSubMatrix(a, n)<<endl;
    
        }
    
         
    
        return 0;
    
    }

    程序运行结果截图:

  • 相关阅读:
    Windows下Rails2.0.2最简安装教程
    xmpp with openfire之三 openfire扩展小试 整合现有系统用户
    母亲的电话
    郁闷……
    博弈
    长春下雪了
    监考
    sql把逗号分隔的字符串拆成临时表
    SQL语句使用大全。
    Left Join、Right Join、Inner Join的区别
  • 原文地址:https://www.cnblogs.com/feiji/p/3608899.html
Copyright © 2020-2023  润新知