二维数组中,值最大的连续子数组
2013-03-03 23:46
267 查看
转自出处
// Program to find maximum sum subarray in a given 2D array #include <stdio.h> #include <string.h> #include <limits.h> #define ROW 4 #define COL 5 // Implementation of Kadane's algorithm for 1D array. The function returns the // maximum sum and stores starting and ending indexes of the maximum sum subarray // at addresses pointed by start and finish pointers respectively. int kadane(int* arr, int* start, int* finish, int n) { // initialize sum, maxSum and start int sum = 0, maxSum = INT_MIN, i; // needed if sum NEVER becomes less than 0 *start = 0; // Standard Kadane's algorithm. See following link // http://www.geeksforgeeks.org/largest-sum-contiguous-subarray/ for (i = 0; i < n; ++i) { sum += arr[i]; if (sum < 0) { sum = 0; *start = i+1; } else if (sum > maxSum) { maxSum = sum; *finish = i; } } return maxSum; } // The main function that finds maximum sum rectangle in M[][] void findMaxSum(int M[][COL]) { // Variables to store the final output int maxSum = 0, finalLeft, finalRight, finalTop, finalBottom; int left, right, i; int temp[ROW], sum, start, finish; // Set the left column for (left = 0; left < COL; ++left) { // Initialize all elements of temp as 0 memset(temp, 0, sizeof(temp)); // Set the right column for the left column set by outer loop for (right = left; right < COL; ++right) { // Calculate sum between current left and right for every row 'i' for (i = 0; i < ROW; ++i) temp[i] += M[i][right]; // Find the maximum sum subarray in temp[]. The kadane() function // also sets values of start and finish. So 'sum' is sum of // rectangle between (start, left) and (finish, right) which is the // maximum sum with boundary columns strictly as left and right. sum = kadane(temp, &start, &finish, ROW); // Compare sum with maximum sum so far. If sum is more, then update // maxSum and other output values if (sum > maxSum) { maxSum = sum; finalLeft = left; finalRight = right; finalTop = start; finalBottom = finish; } } } // Print final values printf("(Top, Left) (%d, %d)\n", finalTop, finalLeft); printf("(Bottom, Right) (%d, %d)\n", finalBottom, finalRight); printf("Max sum is: %d\n", maxSum); } // Driver program to test above functions int main() { int M[ROW][COL] = {{1, 2, -1, -4, -20}, {-8, -3, 4, 2, 1}, {3, 8, 10, 1, 3}, {-4, -1, 1, 7, -6} }; findMaxSum(M); return 0; }
相关文章推荐
- 最大子矩阵:二维数组的最大连续子数组和
- 一维数组和二维数组的最大连续子数组问题
- 连续子数组的最大和
- 二维数组和最大字数组求取 2
- 剑指offer(三十九)之连续子数组的最大和
- 二维数组求子数组中最大的和
- 二维数组的子数组求最大值问题
- 【C】二维数组求最大子数组(基于一维数组的拓展)
- 二维数组 子数组和的最大值
- 连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- golang动态规划求解最大连续子数组和
- 最大连续子数组和。
- [Baidu] 给一个整数数组,求连续子数组最大和
- 连续子数组的最大和
- 求连续子数组的最大和O(n)解法之思路与Java实现
- 连续子数组的最大和(剑指offer31)
- 给定一个数组,找出这个和最大的连续子数组的和
- 连续子数组的最大和