返回一个二维整数数组中最大子数组的和(头尾相接)
2015-06-17 19:42
274 查看
1.题目。
题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思想。
分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。
3.代码。
4.运行结果。
题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思想。
分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。
3.代码。
#include<iostream> using namespace std; #include <ctime> #include <cstdlib> #define MAX 10000 int Max(int b[]) { int m[MAX],n=0,p=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { n=n+b[i+j]; m[p]=n; p++; } n=0; } int max=m[0]; for(i=0;i<p;i++) { if(m[i]>max) max=m[i]; } return max; } int main() { int k[MAX],a[4][8],h[8]; srand(time(0)); cout<<"该矩阵为:"<<endl; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i][j]=rand()%100-50; a[i][j+4]=a[i][j]; cout<<a[i][j]<<" "; } cout<<endl; } for(i=0;i<4;i++) { k[i]=Max(a[i]); } int q=4; for(i=0;i<3;i++) { int t=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]; t++; } k[q]=Max(h); q++; } for(i=0;i<2;i++) { int t=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]+a[i+2][j]; t++; } k[q]=Max(h); q++; } int t=0; i=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j]; t++; } k[q]=Max(h); q++; cout<<endl; int max=k[0]; for(i=0;i<q;i++) { if(k[i]>max) max=k[i]; } cout<<"最大子矩阵的值为:"<<endl; cout<<max; return 0; }
4.运行结果。
相关文章推荐
- 视频会议
- hibernate官方新手教程 (转载)
- 页面跳转 Server.Transfer和 Response.Redirect的区别
- Spring4配置AOP
- Leetcode题解(8):L179/Largest Number
- ashx 使用Session
- poj 3280 Cheapest Palindrome(区间dp)
- Decode Ways
- C++ 学习笔记一易忽略的地方
- 论文写作的提问和选题
- 十五分钟介绍 Redis数据结构
- 杭电2023
- WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere
- leetcode[6]:ZigZag Conversion
- android进度条
- Android学习路径(十)如何将Action Bar堆放在布局
- 不错的博客
- 粉红色梦幻唯美的家庭相册模板
- Guava EventBus配合Spring完成事件分发可配置(变通使用三方库)
- 仿Google相册的侧滑栏效果(DrawerLayout Toolbar)