题目:返回一个二维整数数组中最大子数组的和。
#include<iostream> #include<ctime> using namespace std; #define M 4 #define N 4 int maxline(int *array, int len) //求一维数组最大子序列和 { int i, sum = array[0], b = 0,j = 0; for (i = 0; i<len; ++i) { if (b>0) b += array[i]; else b = array[i]; if (b>sum) sum = b; } return sum; } int maxtwodimension(int n, int m, int array[M][N]) { int i, j, h,g, max, sum = -1000; int b[100]; for(g = 0;g < m;g++){ for (i = 0; i<n; i++) { memset(b, 0, sizeof(b)); //将b[100]中的数字全部初始化为0 for (j = i; j<n; j++) //把第i行到第n行相加,对每一次相加求出最大值 { for (h = g; h<m; h++) { b[h] += array[j][h]; //求一行的和,二维数组压缩成一维数组 } max = maxline(b, h); //按照一维数组求最大子数组的方法,求最大子序列和 if (max>sum) sum = max; } } } return sum; } int main() { int arr[M][N]; cout << "随机二维数组为:" << endl; srand((unsigned)time(0)); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { arr[i][j] = rand() % 100-25; cout << arr[i][j] << " "; } cout << endl; } cout <<"最大子矩阵和为: "<< maxtwodimension(M, N, arr) << endl; return 0; }
设计思路:我还是根据一维数组的求解过程,把二维数组先求出每一行的和储存到一维数组中,根据一维数组的求解过程求出二维数组最大的数组,然后逐步缩小二维数组的行数和列数继续按照一维数组求最大子数组的方法求解。但是使用了o(n4)暂时还是想不出来o(n)的计算方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端