随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

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;
}
复制代码

 

posted on   紫金树下  阅读(539)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示