题目:返回一个二维循环数组中最大子矩阵的和
思路:首先要把n行m列的二维数组压缩成m个一维数组,然后按照一维循环数组求最大子数组的方法求最大子矩阵。
先从第一行到第n行压缩n行的求出最大子矩阵,再从第2行到第n行压缩n-1行,再从第3行到第n行压缩n-2行.。。。以此类推。
需要注意的是正向压缩完毕后也要反向压缩,即从第n行到第1行压缩n行求出最大子矩阵,再从第n-1行到第1行压缩n-1行求出最大子矩阵,再从第n-2行到第1行压缩n-2行求出最大子矩阵.。。以此类推
然后比较所有求得的子矩阵,找出其中最大的那一个,即为二维循环数组的最大子矩阵
时间进度:因为有了返回一维循环数组中最大子数组和的基础所以写返回一个二维循环数组中最大子矩阵的和就比较轻松,累计用时1个半小时
代码如下
#include <iostream> #include <ctime> #define N 5 #define M 10 using namespace std; int maxxunhuan(int array[2*M] , int n){ int i,j,m = 0,c = 0; int sum = array[0],b= 0,max = 0; for(j = 0;j < n;j++) array[n+j] = array[j]; for(j = 0;j < n;j++){ b = 0; sum = 0; for(i = j;i < 2*n;i++){ if(b > 0) b += array[i]; else{ b = array[i]; c = i; } if(b > sum ){ m = i; if(m > c+n-1) break; else sum = b; } } if(sum > max) max = sum; } return max; } void twodimensionxunhuan(int array[N][2*M] , int n , int m){ int arr[100] ; int i,j,sum = 0,sum1 = 0,p,max = 0 ; for(p = 0;p < n;p++){ //正向求最大子矩阵 for(i = 0;i < m;i++) arr[i] = 0; for(i = 0;i < m;i++){ for(j = p;j < n;j++) arr[i] += array[j][i]; } sum = maxxunhuan(arr , m); if(sum > max) max = sum; cout<<'\n'<<"第"<<p+1<<"行到最后一行的最大循环子矩阵为: "<<sum<<endl; } cout<<'\n'<<"*********************************************** "<<endl; for(p = n-1;p >=0;p--){ //逆向求最大子矩阵 for(i = 0;i < m;i++) arr[i] = 0; for(i = 0;i < m;i++){ for(j = p;j >= 0;j--) arr[i] += array[j][i]; } sum1 = maxxunhuan(arr , m); if(sum1 > max) max = sum1; cout<<'\n'<<"第"<<p+1<<"行到第一行的最大循环子矩阵为: "<<sum1<<endl; } cout<<'\n'<<"*********************************************** "<<endl; cout<<'\n'<<"因此二维数组最大循环子矩阵为: "<<max<<endl; } int main(){ int array[N][2*M]; int i,j; memset(array,0,sizeof(array)); //初始化一维数组 cout<<"随机生成的一维数组为的:"<<endl; srand((unsigned)time(0)); for(i = 0;i < N;i++){ for(j = 0;j < M;j++){ array[i][j] = rand()%25-10; cout<<array[i][j]<<'\t'; } cout<<endl; } twodimensionxunhuan(array , N , M); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端