zoukankan      html  css  js  c++  java
  • 35.求一个矩阵中最大的二维矩阵

    /*
         求1个矩阵中最大的二维矩阵
         1。 单就这一题来说,首先方法就是遍历
     */
    
    #include<iostream>
    using namespace std;
    
    
    int a[][5]={{1,2,0,3,4},
                                    {2,3,4,5,1},
                                    {1,1,5,3,0},
                                 };
    
    int m=3;
    int n=5;
    
    void max_matrix(void)
    {
        int i,j,k,s;
        int sum=-65535;
        for(i=0;i<m-1;i++)
        {
            for(j=0;j<n-1;j++)
            {
                int temp=a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1];
                if(temp>sum)
                {
                    sum=temp;
                    k=i;
                    s=j;
                }
            }
        }
    
        cout<<"矩阵是"<<endl;
        cout<<a[k][s]<<" "<<a[k][s+1]<<endl;
        cout<<a[k+1][s]<<" "<<a[k+1][s+1]<<endl;
    }
    
    int main(void)
    {
        max_matrix();
    
        return 0;
    }
    /*
         还有1种情况,给定1个m*n的矩阵,让你求这个最大的子矩阵的和是多少,不再是2维矩阵了
         假设矩阵是
         a11 a12 a13 .... a1n
         a21 a22 a23 .... a2n
         .
         .
         .
         am1 am2 am3 .... amn
    
         其中有
         ari ari+1 ari+2 ... arj
         ar+1i ...
         .
         .
         aki aki+1 ......... akj
         是和最大的子矩阵,即有(ari + ar+1i + ar+2i +...+ aki)+(ari+1 + ar+1i+1 + ... + aki+1)+(...)和是最大的,我们把每一列的和都看成1个数
         用a[i],a[i+1],,,,a[j]来表示,那么就是a[i]+a[i+1]+...+a[j]是最大的,就变成求这个数组中连续的值的最大和问题,因为在a[1],a[2],,,a[i]..a[j]...a[n]中a[i]+..+a[j]是最大的
    
         做法就是,第r行到第k行,我们把每一列相加,看成是1个数组,然后求这个数组的连续和最大值,那么求出的就是第r到k行的,第i到第j列就是这个小矩阵的最大自矩阵和了
    
     */
    
    #include<iostream>
    using namespace std;
    
    int a[][5]={{1,2,0,3,4},
                          {2,3,4,5,1},
                            {1,1,5,3,0},
                         };
    
    int m=3;
    int n=5;
    
    int max_array(int* array)
    {
        int i,j;
        int* c=new int[n];
    
        c[0]=array[0];
        for(i=1;i<n;i++)
        {
            if(c[i-1]<0)
                c[i]=array[i];
            else
                c[i]=c[i-1]+array[i];
        }
        int max_sum=-65535;
        for(i=0;i<n;i++)
            if(c[i]>max_sum)
                max_sum=c[i];
        delete []c;
        return max_sum;
    }
    
    
    int max_matrix()
    {
        //求第i行到第j行的
        int i,j,k,s;
        int max_sum=-65535;
    
        int *b=new int[n];
        for(i=0;i<m;i++)
        {
            for(s=0;s<n;s++)
                b[s]=0;
            for(j=i;j<m;j++)
            {
                for(k=0;k<n;k++)
                    b[k]+=a[j][k];
                int sum=max_array(b);
                if(sum>max_sum)
                    max_sum=sum;
            }
        }
    
        delete []b;
        return max_sum;
    }
    
    int main(void)
    {
        cout<<max_matrix()<<endl;
    
        return 0;
    }
  • 相关阅读:
    开通博客园
    ios关键字
    FirstDay
    An example for pysnmp
    remove debug symbols to a seperate file
    qemu下通过gdb调试内核时 遇到 evaluation of this expression requires the program to have a function "malloc" 错误的解决办法
    关于常识与知识的思考
    基于Qemu在ubuntu上构建linux学习环境
    How to download prebuilt toolchain
    诡异的打印异常BUG
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3270324.html
Copyright © 2011-2022 走看看