一、题目
返回一个二维整数数组中最大子数组的和。
二、要求
输入一个二维整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
三、设计思想
本次数组03实验是在上次实验的基础上,利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。这样的缺陷是时间花费比较多,而且没有用文件来实现,只是实现在程序中输入输出。
四、源代码
1 //数组03 2 //胡浩特、朱子嘉 2016/3/28 3 4 #include <iostream> 5 using namespace std; 6 7 int maxSubArray(int **a, int n, int m) 8 { 9 int **p = new int*[n]; 10 int i, j; 11 if (m == 0 || n == 0) 12 return 0; 13 //计算p[i][j] 14 for (i = 0; i<n; i++) 15 { 16 p[i] = new int[m]; 17 for (j = 0; j<m; j++) 18 { 19 if (i == 0) 20 { 21 if (j == 0) 22 p[i][j] = a[i][j]; 23 else 24 p[i][j] = p[i][j - 1] + a[i][j]; 25 } 26 else 27 { 28 if (j == 0) 29 p[i][j] = p[i - 1][j] + a[i][j]; 30 else 31 p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j]; 32 } 33 } 34 } 35 //计算二维数组最大子数组的和 36 int temp; 37 int max = a[0][0];//初始化 38 int sum = a[0][0]; 39 if (m == 1) 40 { 41 for (i = 0; i<n; i++) 42 { 43 for (j = i; j<n; j++) 44 { 45 if (i == 0) 46 { 47 temp = p[j][m - 1]; 48 } 49 else 50 { 51 temp = p[j][m - 1] - p[i - 1][m - 1]; 52 } 53 if (sum<temp) 54 sum = temp; 55 } 56 } 57 } 58 else 59 { 60 for (i = 0; i<n; i++) 61 { 62 for (j = i; j<n; j++) 63 { 64 if (i == 0) 65 { 66 temp = p[j][m - 1] - p[j][m - 2]; 67 } 68 else 69 { 70 temp = p[j][m - 1] - p[j][m - 2] - p[i - 1][m - 1] + p[i - 1][m - 2]; 71 } 72 for (int k = m - 2; k >= 0; k--) 73 { 74 if (temp<0) 75 temp = 0; 76 if (i == 0) 77 { 78 if (k == 0) 79 temp += p[j][k]; 80 else 81 temp += p[j][k] - p[j][k - 1]; 82 } 83 else 84 { 85 if (k == 0) 86 temp += p[j][k] - p[i - 1][k]; 87 else 88 temp += p[j][k] - p[j][k - 1] - p[i - 1][k] + p[i - 1][k - 1]; 89 } 90 if (sum<temp) 91 sum = temp; 92 } 93 } 94 } 95 } 96 return sum; 97 } 98 99 int main() 100 { 101 int n;//行数 102 int m;//列数 103 104 cout << "请输入二维数组的行数:" << endl; 105 cin >> n; 106 cout << "请输入二维数组的列数:" << endl; 107 cin >> m; 108 109 int i, j; 110 int **a = new int*[n]; 111 cout << "请输入该二维数组元素:" << endl; 112 for (i = 0; i<n; i++) 113 { 114 a[i] = new int[m]; 115 116 for (j = 0; j<m; j++) 117 { 118 cin >> a[i][j]; 119 } 120 } 121 int sum;//最大字数组的和 122 sum = maxSubArray(a, n, m); 123 cout << "二维数组的最大子数组之和:" << sum << endl; 124 return 0; 125 }
五、实验结果
六、实验总结
本次实验的算法不够简洁,希望可以找到更加高效的算法,而且没有实现从txt文件中读入二维数组的数值,希望以后可以改进,这次实验虽然不难,但也学到了不少知识,以及如何把二维数组降维成一维数组。
时间: 2024-10-23 16:39:48