结对成员:范德一 赵永恒
一.题目与要求
题目、返回一个二维整数数组中最大子数组的和
要求、1、输入一个二维整形数组,数组里有正数也有负数。
2、二维数组首尾相接,象个一条首尾相接带子一样。
3、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和
二.设计思路
在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求。
- 第一步、将每一行的数组作为循环数组求最大子数组
- 第二步、通过枚举的方式,将每一种情况的和存入到新建二维数组中
- 第三部、通过逐列计算最大子数组的方法求所有子矩阵的最大和
三.源代码
1 #include "stdafx.h" 2 3 #include "iostream" 4 5 #include <vector> 6 7 using namespace std; 8 9 10 11 const int N = 101; 12 13 int a[N][N], p[N][N],b[N][N]; 14 15 16 17 int MaxRecSum(int n) 18 19 { 20 21 for (int i = 0; i <= n; ++i) 22 23 { 24 25 p[i][0] = 0; 26 27 p[0][i] = 0; 28 29 } 30 31 for (int i = 1; i <= n; ++i) 32 33 { 34 35 for (int j = 1; j <= n; ++j) 36 37 p[i][j] = p[i-1][j] + p[i][j-1] - p[i-1][j-1] +a[i][j]; 38 39 } 40 41 42 43 int max = INT_MIN; 44 45 for (int i = 1; i <= n; ++i) 46 47 { 48 49 for (int j = i; j <= n; ++j) 50 51 { 52 53 int sum = 0; 54 55 for (int k = 1; k <= n; ++k) 56 57 { 58 59 int temp = p[j][k] - p[j][k-1] - p[i-1][k] + p[i-1][k-1]; 60 61 if (sum > 0) 62 63 sum += temp; 64 65 else 66 67 sum = temp; 68 69 if (sum > max) 70 71 max = sum; 72 73 } 74 75 } 76 77 } 78 79 return max; 80 81 } 82 83 84 85 int main() 86 87 { 88 89 90 91 int n = 3; 92 93 int num; 94 95 cout<<"矩阵的规格为三行三列,请输入数值:"<<endl; 96 97 for (int i = 1; i <= n; ++i) 98 99 { 100 101 for (int j = 1; j <= n; ++j) 102 103 { 104 105 cin >> num; 106 107 a[i][j] = num; 108 109 } 110 111 } 112 113 114 115 int b[3][6]; 116 117 118 119 for(int t=0;t<3;t++) 120 121 { 122 123 b[t][0]=a[t][0]; 124 125 b[t][1]=a[t][1]; 126 127 b[t][2]=a[t][2]; 128 129 130 131 132 133 b[t][3]=b[t][0]; 134 135 b[t][4]=b[t][1]; 136 137 b[t][5]=b[t][2]; 138 139 } 140 141 142 143 cout <<"最大矩阵的和为:"<< MaxRecSum(n) << endl; 144 145 146 147 for (int i = 1; i <= n; ++i) 148 149 { 150 151 for (int j = 1; j <= n; ++j) 152 153 { 154 155 cout <<a[i][j]<<" "; 156 157 } 158 159 cout<<endl; 160 161 } 162 163 return 0; 164 165 }
四.运行截图
五.实验感想
最近清明节的假期来得太突然、太多的心思没有放在这个程序上,最后的完成太仓促,没有太多实际的讨论和交流。不过在配合下能编出这个小程序还是很不错的,很多地方有待改进。下次两个人的心思应该专心一点。
六.结对成员合照