1)输入部分

对于输入部分,我定义的输入格式是这样的

前两行为列数和行数

如果文件无法打开,或者输入文件格式不对,均会提示出错并退出

2)二维数组的最大矩形子数组

首先,我使用最最简单的暴力算法,直接用四个for循环实现,这个算法虽然时间复杂度达到O(M^2*N^2),但可以用于检测优化算法的正确性。

  1. int maxNum1(int m,int n){
  2. int pre[][] = {};
  3. int sum = ,max = ;
  4. for(int i=;i<=m;i++)
  5. for(int j=;j<=n;j++)
  6. pre[i][j]=pre[i-][j]+pre[i][j-]-pre[i-][j-]+matrix[i][j];
  7.  
  8. for(int i=; i<=m; i++)
  9. for(int j=;j<=n;j++)
  10. for(int k=i; k<=m; k++)
  11. for(int l=j; l<=n; l++){
  12. sum = pre[k][l] - pre[k][j-] - pre[i-][l] + pre[i-][j-];
  13. if(sum > max)
  14. max = sum;
  15. }
  16. return max;
  17. }

matrix是存放输入的二维数组,从[1][1]开始

  1. pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+matrix[i][j];

是将pre[i][j]存放从matrix[1][1]到matrix[i][j]这个的矩形数组和

故在后面可以用

  1. sum = pre[k][l] - pre[k][j-1] - pre[i-1][l] + pre[i-1][j-1];

一维的情况,上次已经给出了O(N)的算法,是否可以在二维也用上呢?

我是将一个维度上使用暴搜,另一个维度上为上次作业给出的O(N)的算法

  1. int maxNum2(int m,int n){
  2. int pre[][] = {};
  3. int sum = ,max = ;
  4. int columnsMax = ;
  5. for(int i=;i<=m;i++)
  6. for(int j=;j<=n;j++)
  7. pre[i][j] = pre[i][j-] + matrix[i][j];
  8.  
  9. for(int i=; i<=n; i++)
  10. for(int j=i;j<=n;j++){
  11. for(int k=; k<=m; k++){
  12. if(sum<)
  13. sum=pre[k][j] - pre[k][i-];
  14. else
  15. sum+=pre[k][j] - pre[k][i-];
  16. if(columnsMax < sum)
  17. columnsMax = sum;
  18. }
  19. sum = ;
  20. }
  21.  
  22. return columnsMax;
  23. }

这次的处理和上一个不一样,由于在一个维度上用了那个O(N)算法,所以pre[i][j]存的是i行 matrix[i][1]到matrix[i][j]的和

这样算法的时间复杂度为O(M*N^2)

其实,还可以优化一点,就是选择使用O(N)算法的维度时选择M,N中大者,则时间复杂度可以降到O(M*N*min(M,N))

3)水平,垂直!

这个改动,我想了想,水平的话就是水平方向在放一个同样的数组,然后继续用2)中算法

垂直也一样的

2 -1 3
-1 1 -2

变为

2 -1 3 2 -1 3
-1 1 -2 -1 1 -2

这样的话,就容易了

  1. int maxNum4(int m, int n){
  2. int pre[][] = {};
  3. int sum = ,max = ;
  4. int columnsMax = ;
  5. for(int i=;i<=m;i++)
  6. for(int j=;j<=*n;j++)
  7. pre[i][j] = pre[i][j-] + matrix[i][(j-)%n +];
  8.  
  9. for(int i=; i<=n; i++)
  10. for(int j=i;j<=i+n-;j++){
  11. for(int k=; k<=m; k++){
  12. if(sum<)
  13. sum=pre[k][j] - pre[k][i-];
  14. else
  15. sum+=pre[k][j] - pre[k][i-];
  16. if(columnsMax < sum)
  17. columnsMax = sum;
  18. }
  19. sum = ;
  20. }
  21.  
  22. return columnsMax;
  23. }

算法上有些小改动,就是要限制子数组行列不超过原数组

垂直的就不在这写了。

4)轮胎?备胎~

这个我是这样想的,就是将4个原数组拼接一个大数组,然后继续用前面的算法

1 -1
-1 2

变为

1 -1 1 -1
-1 2 -1 2
1 -1 1 -1
-1 2 -1 2

在实现上和上面的水平代码大同小异。

5)连通!真的想不出来了

首先想到贪心,二维贪心好像不可行

接着想用图论,把矩阵转为一个有向图,求出一条最大连通路径

使用了各种最短路径算法,还是不行

真心难啊。放弃治疗!

附:代码)

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. #define FIE "Input string was not in a correct format"
  7. FILE* in;
  8. int matrix[][] = {};
  9. int map[][] = {};
  10. int sxbkM[][] = {-};
  11.  
  12. void positiveSub(int m, int n, int label );
  13. inline void error(char* s){
  14. printf("Error: ");
  15. printf("%s\n",s);
  16. exit();
  17. }
  18. int maxNum1(int m,int n){
  19. int pre[][] = {};
  20. int sum = ,max = ;
  21. for(int i=;i<=m;i++)
  22. for(int j=;j<=n;j++)
  23. pre[i][j]=pre[i-][j]+pre[i][j-]-pre[i-][j-]+matrix[i][j];
  24.  
  25. for(int i=; i<=m; i++)
  26. for(int j=;j<=n;j++)
  27. for(int k=i; k<=m; k++)
  28. for(int l=j; l<=n; l++){
  29. sum = pre[k][l] - pre[k][j-] - pre[i-][l] + pre[i-][j-];
  30. if(sum > max)
  31. max = sum;
  32. }
  33. return max;
  34. }
  35. int maxNum2(int m,int n){
  36. int pre[][] = {};
  37. int sum = ,max = ;
  38. int columnsMax = ;
  39. for(int i=;i<=m;i++)
  40. for(int j=;j<=n;j++)
  41. pre[i][j] = pre[i][j-] + matrix[i][j];
  42.  
  43. for(int i=; i<=n; i++)
  44. for(int j=i;j<=n;j++){
  45. for(int k=; k<=m; k++){
  46. if(sum<)
  47. sum=pre[k][j] - pre[k][i-];
  48. else
  49. sum+=pre[k][j] - pre[k][i-];
  50. if(columnsMax < sum)
  51. columnsMax = sum;
  52. }
  53. sum = ;
  54. }
  55.  
  56. return columnsMax;
  57. }
  58. //水平
  59. int maxNum4(int m, int n){
  60. int pre[][] = {};
  61. int sum = ,max = ;
  62. int columnsMax = ;
  63. for(int i=;i<=m;i++)
  64. for(int j=;j<=*n;j++)
  65. pre[i][j] = pre[i][j-] + matrix[i][(j-)%n +];
  66.  
  67. for(int i=; i<=n; i++)
  68. for(int j=i;j<=i+n-;j++){
  69. for(int k=; k<=m; k++){
  70. if(sum<)
  71. sum=pre[k][j] - pre[k][i-];
  72. else
  73. sum+=pre[k][j] - pre[k][i-];
  74. if(columnsMax < sum)
  75. columnsMax = sum;
  76. }
  77. sum = ;
  78. }
  79.  
  80. return columnsMax;
  81. }
  82.  
  83. //竖直环
  84. int maxNum5(int m,int n){
  85. int pre[][] = {};
  86. int sum = ,max = ;
  87. int columnsMax = ;
  88. for(int i=;i<=m;i++)
  89. for(int j=;j<=n;j++)
  90. pre[i][j] = pre[i][j-] + matrix[i][j];
  91.  
  92. int x=;
  93. for(int i=; i<=n; i++)
  94. for(int j=i;j<=n;j++){
  95. for(int k=; k <= m*; k++){
  96. if(sum< || x >m){
  97. x=;
  98. sum=pre[(k-)%m + ][j] - pre[(k-)%m + ][i-];
  99. }
  100. else{
  101. x++;
  102. sum+=pre[(k-)%m + ][j] - pre[(k-)%m + ][i-];
  103. }
  104. if(columnsMax < sum)
  105. columnsMax = sum;
  106. }
  107. sum = ;
  108. }
  109.  
  110. return columnsMax;
  111. }
  112. //备胎
  113. int maxNum6(int m, int n){
  114. int pre[][] = {};
  115. int sum = ;
  116. int columnsMax = ;
  117. for(int i=;i<=m;i++)
  118. for(int j=;j<=*n;j++)
  119. pre[i][j] = pre[i][j-] + matrix[i][(j-)%n +];
  120.  
  121. int x=;
  122. for(int i=; i<=n; i++)
  123. for(int j=i;j<=i+n-;j++){
  124. for(int k=; k <= m*; k++){
  125. if(sum< || x >m){
  126. x=;
  127. sum=pre[(k-)%m + ][j] - pre[(k-)%m + ][i-];
  128. }
  129. else{
  130. x++;
  131. sum+=pre[(k-)%m + ][j] - pre[(k-)%m + ][i-];
  132. }
  133. if(columnsMax < sum)
  134. columnsMax = sum;
  135. }
  136. sum = ;
  137. }
  138.  
  139. return columnsMax;
  140.  
  141. }
  142.  
  143. int getNum(){
  144. char num[],input;
  145. int i=,n;
  146. input = fgetc(in);
  147. while(!isdigit(input) && input != '-' ){
  148. if(input != ' ' && input != '\n' &&
  149. input != NULL && input != ',' &&
  150. input != '\0')
  151. error(FIE);
  152. input = fgetc(in);
  153. }
  154.  
  155. do{
  156. num[i++] = input;
  157. input = fgetc(in);
  158. }while(isdigit(input));
  159.  
  160. num[i] = '\0';
  161. n = atoi(num);
  162.  
  163. return n;
  164. }
  165. void initialize(int m,int n){
  166. for(int i=; i<; i++)
  167. for(int j=; j<; j++)
  168. sxbkM[i][j] = -;
  169. for(int i=; i<=m; i++){
  170. for(int j=; j<=n; j++){
  171. matrix[i][j] = getNum();
  172. }
  173. }
  174. }
  175. int maxNum3(int m, int n){
  176. return ;
  177. }
  178. void positiveSub(int i, int j, int label ){
  179. map[i][j] = label;
  180. if(matrix[i][j+] >= && map[i][j+] ==)
  181. positiveSub(i,j+,label);
  182.  
  183. if(matrix[i+][j] >= && map[i+][j] ==)
  184. positiveSub(i+,j,label);
  185.  
  186. if(matrix[i][j-] >= && map[i][j-] ==)
  187. positiveSub(i,j-,label);
  188.  
  189. if(matrix[i-][j] >= && map[i-][j] ==)
  190. positiveSub(i-,j,label);
  191. }
  192.  
  193. int main(int argc, char *argv[]){
  194.  
  195. int m,n;
  196. char input,num[];
  197. if( argc == )
  198. error("Plese run with the file name");
  199. else if(argc == ){
  200. if((in = fopen(argv[], "r")) == NULL)
  201. error("File can not open");
  202. }
  203. else if(argc == ){
  204. if((in = fopen(argv[], "r")) == NULL)
  205. error("File can not open");
  206. }
  207. else if(argc == ){
  208. if((in = fopen(argv[], "r")) == NULL)
  209. error("File can not open");
  210. }
  211. else error("Too many parameters");
  212.  
  213. m = getNum();
  214. if(fgetc(in)!= '\n')
  215. error(FIE);
  216. n = getNum();
  217. if(fgetc(in)!= '\n')
  218. error(FIE);
  219. initialize(m,n);
  220.  
  221. if( argc == )
  222. std::cout<<std::endl<<"子数组: "<< maxNum2(m,n);
  223. else if( argc == ){
  224. if(strcmp(argv[],"/a") == )
  225. printf("Sorry,I haven't solved the problem.\n");
  226. else if(strcmp(argv[],"/h") == )
  227. std::cout<<std::endl<<"水平环: "<< maxNum4(m,n);
  228. else if(strcmp(argv[],"/v") == )
  229. std::cout<<std::endl<<"竖直环: "<< maxNum5(m,n);
  230. else error("Wrong parameter");
  231. }
  232. else{
  233. if((strcmp(argv[],"/v") == && strcmp(argv[],"/h") == )
  234. ||(strcmp(argv[],"/h") == && strcmp(argv[],"/v") == ) )
  235. std::cout<<std::endl<<"备胎环: "<< maxNum6(m,n);
  236. else error("Wrong parameter\n");
  237. }
  238. return ;
  239. }

homework-02 二维的,好喝的(二维数组的各种子数组)的更多相关文章

  1. Android zxing 解析二维码,生成二维码极简demo

    zxing 官方的代码很多,看起来很费劲,此demo只抽取了有用的部分,实现了相机预览解码,解析本地二维码,生成二维码三个功能. 简化后的结构如下: 废话少说直接上代码: BaseDecodeHand ...

  2. Android实例-实现扫描二维码并生成二维码(XE8+小米5)

    相关资料: 第三方资料太大没法写在博文上,请下载CSDN的程序包. 程序包下载: http://download.csdn.net/detail/zhujianqiangqq/9657186 注意事项 ...

  3. C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)

    1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...

  4. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  5. 求二维数组的最大子数组———曹玉松&&蔡迎盈

    继上节课老师让求了一维数组最大的子数组后,这节课堂上,老师加深了难度,给了一个二维数组,求最大子数组,开始觉得很容易,但是自己思考起来感觉这个算法很困难,既需要考虑数组直接的连续,又要求出最大的,老师 ...

  6. 二维数组转化为一维数组 contact 与apply 的结合

    将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转换.本文将从朴素的循环转换开始,逐一介绍三 ...

  7. 二维数组 cudaMallocPitch() 和三维数组 cudaMalloc3D() 的使用

    ▶ 使用函数 cudaMallocPitch() 和配套的函数 cudaMemcpy2D() 来使用二维数组.C 中二维数组内存分配是转化为一维数组,连贯紧凑,每次访问数组中的元素都必须从数组首元素开 ...

  8. 二维数组,锯齿数组和集合 C# 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用 C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)

    二维数组,锯齿数组和集合 一.二维数组 二维数组:一维数组----豆角二维数组----表格 定义:1.一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = ...

  9. PCA 实例演示二维数据降成1维

    import numpy as np # 将二维数据降成1维 num = [(2.5, 2.4), (0.5, 0.7), (2.2, 2.9), (1.9, 2.2), (3.1, 3.0), (2 ...

随机推荐

  1. StackExchange.Redis使用和封装小试

    StackExchange.Redis使用和封装小试 https://git.oschina.net/Ultralisk/ThorActor/blob/ThorActor/DBUtility/Redi ...

  2. Visual studio 2013 Team Foundation Server TFS2013 设置签出独占锁

    摘自: http://www.cnblogs.com/52XF/p/4239056.html 以备自查 如侵权,请告知

  3. A planning attack on a commuter train carriage in Taipei

    Last night an explosion on a commuter train carriage in Taipei Songshan railway station wounded at l ...

  4. leetcode 118

    118. Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, ...

  5. SQLserver2012 修改数据库架构

    还原数据库以后,发现有一张表的架构不对,执行sql提示:对象名无效.

  6. 网络基础知识、ASP.NET 核心知识(1)*

    为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...

  7. [视频]ARM告诉你物联网怎么玩,mbed 6LoWPan demo

    该视频演示了基于arm mbed的物联网设备间的6LoWPAN应用,如连接家里的土壤湿度传感器,灯光控制,安防联动等应用. 演示视频       原创文章,转载请注明: 转载自 http://www. ...

  8. xode View 的封装

    1.Xcode自带头文件的路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Develo ...

  9. 用,隔开sql临时表

    IF OBJECT_ID('[kkd].[proc_kkd_GetAutoExamineBid]') IS NOT NULL BEGIN DROP PROC [kkd].[proc_kkd_GetAu ...

  10. (转)Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询

    1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...