在一个由正负数字组成的矩形中,找一个小矩形使其和最大
如
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
是
9 2
-4 1
-1 8
这个想了好半天没想出子问题是什么,看了网上的答案才知道转化为求最大连续子序列和问题。
一次把1、2、3、4 、。。。、m行合并为一行求最大连续子序列和。
当各个x行合并时求出的就是x*y的子矩形和。
代码:
Source Code
Problem: 1050 | User: jluliuxy | |
Memory: 272K | Time: 32MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream> using namespace std; int main() { short num; cin>>num; short** arr = new short*[num]; int i; for( i = 0; i < num; i++) arr[i] = new short[num]; int j; for( i = 0; i < num; i++) { for( j = 0; j < num; j++ ) { cin>>arr[i][j]; } } int max = -1270000; int k; for( i = 1 ; i <= num; i++ ) {//求i行组成的一维数组的最大连续子序列和 for( j = 0; j <= (num-i); j++ ) { int temp = 0; int maxt = -1270000; int sum = 0; for( k = 0; k < num; k++ ) { temp = 0; for( int t = 0; t < i ; t++ ) { temp += arr[j+t][k]; } if( sum > 0 ) sum += temp; else sum = temp; if( sum > maxt ) maxt = sum; } //cout<<"将"<<i<<"行作为一维数组且 起始行j="<<j<<"时最大值为:"<<maxt<<endl; if(maxt > max ) max = maxt; } } cout<<max<<endl; return 0; }