任务:

(1)输入一个二维整形数组,数组里有正数也有负数。
(2)二维数组首尾相接,象个一条首尾相接带子一样。
(3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(4)求所有子数组的和的最大值。
1.设计思想:这个题目显然是结合了之前二维数组求最大子数组的和以及一维环形数组求最大连续子数组的和两个模块,所以只要将两个程序联合起来即可。首先将数组横向扩展一倍,将环转换为求一维连续的数组求最大子数组和。然后将二维数组转换为一维数组求和,即建立一个新的和数组,用来储存从数组的首个元素到当前位置元素的连续子数组的最大和,其中会用到一位数组求连续最大子数组程序中的部分代码。然后这个问题就可以被转化为求新的和数组中的最大元素了,就能很方便地求出最大子矩阵的和。
2.源代码:
//二维环形数组求最大子矩阵
//刘子晗 2015/4/22 #include<iostream>
#include<time.h>
using namespace std; void main()
{
int m, n, a[][], b[][],i, j ;
cout << "请输入矩阵的行数和列数:" << endl;
cin >> m >> n;
srand((unsigned)time(NULL));
cout << "产生的随机数组为:" << endl;
for (i = ; i < m; i++)
{
for (j = ; j < n; j++)
{
a[i][j] = rand() % - ;
cout << a[i][j] << " ";
}
cout << endl;
}//输出随机产生的矩阵 int max = a[][];
for (i = ; i < m ; i++)
{
for (j = ; j < n; j++)
{
a[i][j + n] = a[i][j];
}
}//对二维数组进行扩展,横向延长一倍 cout << "扩展后环形数组为:" << endl;
for (i = ; i < m; i++)
{
for (j = ; j < *n-; j++)
{
cout << a[i][j] << ' ';
}
cout << endl;
}//输出扩展之后的新数组 for (i = ; i < ; i++)
{
b[][] = a[][];
for (j = ; j < *n -; j++)
{
if (a[][j - ] < )
{
b[][j] = a[][j];
}
else
{
b[][j] = b[][j - ] + a[][j];
}
}
}//对第一行的数作为一个数组求其最大连续子数组之和 for (i = ; i < m; i++)
{
for (j = ; j < ; j++)
{
if (a[i - ][] < )
{
b[i][] = a[i][];
}
else
{
b[i][] = b[i - ][] + a[i][];
}
}
}//对第一列的数作为一个数组,求其连续子数组的最大和 for (i = ; i<m; i++)
{
for (j = ; j<*n-; j++)
{
if (b[i - ][j - ]<)
{
if (b[i - ][j] >= && b[i][j - ] >= )
{
if (b[i][j - ] >= b[i - ][j])
{
b[i][j] = b[i][j - ] + a[i][j];
}
else
{
b[i][j] = b[i - ][j] + a[i][j];
}
}
else if (b[i - ][j] >= && b[i][j - ] <= )
{
b[i][j] = b[i - ][j] + a[i][j];
}
else if (b[i - ][j] <= && b[i][j - ] >= )
{
b[i][j] = b[i][j - ] + a[i][j];
}
else
{
b[i][j] = a[i][j];
}
}
else
{
if (b[i - ][j] >= && b[i][j - ] >= )
{
b[i][j] = a[i][j] + b[i - ][j] + b[i][j - ] - b[i - ][j - ];
}
else if (b[i - ][j] >= && b[i][j - ] <= )
{
b[i][j] = a[i][j] + b[i - ][j] - b[i - ][j - ];
}
else if (b[i - ][j] <= && b[i][j - ] >= )
{
b[i][j] = a[i][j] + b[i][j - ] - b[i - ][j - ];
}
else
{
b[i][j] = a[i][j];
}
}
}
}//求整个矩阵中从首个元素到当前元素的数组和的最大值,并将该值赋给当前地址 cout << "子矩阵的和数组为:" << endl;
for (i = ; i<m; i++)
{
for (j = ; j< * n - ; j++)
{
cout << b[i][j] << " ";
}
cout << endl;
}//输出新生成的和数组 cout << endl;
for (i = ; i<m; i++)
{
for (j = ; j< * n - ; j++)
{
if (b[i][j]>max)
{
max = b[i][j];
} }
}//求数组中的最大元素
cout << "最大子矩阵和为:" << max << endl;
}

3.结果截图:

4.总结:(1)再一次感觉到拆分问题的重要性,无论题目有多复杂,当拥有可以拆分问题的能力的时候,一一击破然后再将其有机地组合起来,一切问题都会迎刃而解;

(2)题目在一步一步地增加难度的时候,如果能把之前的每个相对简单的程序都弄明白之后,组合成的难题反而却是非常简单的。所以每次完成一个程序一定要完全把它想清楚,非以方便以后去使用其中的内容和思想;

(3)要善于总结,每一次总结回顾总能发现不一样的问题,得到不一样的体会。

Task 4.4二维环形数组求最大子矩阵之和的更多相关文章

  1. Codeforces Round #369 (Div. 2) A. Bus to Udayland【字符串/二维字符数组求连起来的座位并改为其他字符】

    A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理

    //给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...

  3. PHP二维关联数组的遍历方式

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...

  4. C++ 指针二维数组, C++二维指针数组笔记

    C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...

  5. 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛

    子串查询 Time Limit: 3500/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  6. 二维字符数组利用gets()函数输入

    举例: ][]; ;i<;i++) gets(a[i]); a是二维字符数组的数组名,相当于一维数组的指针, 所以a[i]就相当于指向第i个数组的指针,类型就相当于char *,相当于字符串.

  7. 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector

    先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...

  8. go 动态数组 二维动态数组

    go使用动态数组还有点麻烦,比python麻烦一点,需要先定义. 动态数组申明 var dynaArr []string 动态数组添加成员 dynaArr = append(dynaArr, &quo ...

  9. 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参

    [问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...

随机推荐

  1. 一份可以落地靠谱iOS开发规范

    列出来的都是个人觉得在团队合作,代码阅读,代码维护中比较重要的一些点,没有什么空格 间距华而不实的东西在里面.涉及 命名规范.编码规范.代码管理规范 命名规范 项目名都遵循大驼峰命名.例如:MSMob ...

  2. redis五种数据结构及使用场景

    string(字符串) 存储最简单的key-value结构. value可以是字符串.整数或者浮点数. 可以对整个字符串或者字符串的一部分执行操作: 对整数和浮点数执行自增或者自减操作. 使用场景: ...

  3. Python2.7在Windows下CMD编码为65001/utf-8时print报错[Errno 0]/[Errno 2]

    使用python2.7处理unicode的字符串,环境变量已设置PYTHONIOENCODING为utf-8,cmd编码为utf-8时print unicode字符串会报错[Errno 0]或[Err ...

  4. CTF-i春秋网鼎杯第四场部分writeup

    CTF-i春秋网鼎杯第四场部分writeup 因为我们组的比赛是在第四场,所以前两次都是群里扔过来几道题然后做,也不知道什么原因第三场的题目没人发,所以就没做,昨天打了第四场,简直是被虐着打. she ...

  5. maven第一天——入门与基本概念

    一.什么是maven? 1.概述 核心点:项目构建.依赖管理.[更新]:源码关联 (如何关联源码:在依赖的jar上右击 maven download source即可) Maven是一个项目管理和综合 ...

  6. 20155226 2016-2017-2 《Java程序设计》第9周学习总结

    20155226 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商 ...

  7. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  8. 《Java 程序设计》实验报告汇总

    <Java 程序设计>实验报告汇总 20145207<Java程序设计>实验一 (Java开发环境的熟悉)实验报告 20145207<Java程序设计>实验二 (J ...

  9. 【HNOI2013】消毒

    题面 题解 当只有二维时,就是一个二分图匹配的板子题 三维的时候就很好做了,暴力枚举一维的情况,因为\(\min(x,y,z) = \sqrt{5000} < 18\),于是时间复杂度有保证 代 ...

  10. 【BZOJ1041】[HAOI2008]圆上的整点

    [BZOJ1041][HAOI2008]圆上的整点 题面 bzoj 洛谷 题解 不妨设\(x>0,y>0\) \[ x^2+y^2=r^2\\ y^2=(x+r)(x-r) \] 设\(r ...