Description
Given a 2-dimensional array of positive and negative integers, find the sub-rectangle with the largest sum. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle. A sub-rectangle is any contiguous sub-array of size 1 × 1 or greater located within the whole array.
As an example, the maximal sub-rectangle of the array:
0 | −2 | −7 | 0 |
9 | 2 | −6 | 2 |
−4 | 1 | −4 | 1 |
−1 | 8 | 0 | −2 |
is in the lower-left-hand corner and has the sum of 15.
Input
The input consists of an N × N array of integers. The input begins with a single positive integer N on a line by itself indicating the size of the square two dimensional array. This is followed by N 2 integers separated by white-space (newlines and spaces). These N 2 integers make up the array in row-major order (i.e., all numbers on the first row, left-to-right, then all numbers on the second row, left-to-right, etc.). N may be as large as 100. The numbers in the array will be in the range [−127, 127].
Output
The output is the sum of the maximal sub-rectangle.
Sample Input
input | output |
---|---|
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 |
15 |
大意:问你最大的矩阵和,坑死我了WA了n发。。原来做的方法错了。没有考虑当答案为负值的时候
dp[i][j][k]表示i行j列从k个元素开始往前的和,三重循环保证所有情况都遍历到
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[150][150][150]; int a[150][150]; const int inf = 0x3f3f3f3f; int main() { int n; while(~scanf("%d",&n)){ for(int i = 1; i <= n ; i++) for(int j = 1; j <= n ;j++) scanf("%d",&a[i][j]); memset(dp,0,sizeof(dp)); int ans = -inf; for(int i = 1; i <= n ; i++){ for(int j = 1; j <= n ;j++){ int sum = 0; for(int k = j; k >= 1; k--){ sum += a[i][k]; dp[i][j][k] = max(sum + dp[i-1][j][k],sum); ans = max(ans,dp[i][j][k]); } } } printf("%d\n",ans); } return 0; }
错误代码也来一发....祭奠我8个WA一个CE..
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int a[150][150]; int n,m; scanf("%d",&n); for(int i = 1; i <= n ;i++){ for(int j = 1; j <= n ;j++){ scanf("%d",&m); a[i][j] = a[i-1][j] + m; } } int max1 = 0; int sum; for(int i = 1; i <= n ;i++){ for(int j = i+1 ; j<= n ;j++){ int sum = 0; for(int k = 1; k <= n;k++){ int temp = a[j][k] - a[i][k]; sum += temp; if(sum < 0) sum = 0; if(sum > max1) max1 = sum; } } } printf("%d",max1); return 0; }