[每日一题] 03 暴力6重循环解最大子数组和

 

#include <iostream>

using namespace std;

int main() {
	int n, m;
    cin >> n >> m;
    int arr[n][m];
    for (int i = 0 ; i < n ; ++i) {
		for (int j = 0 ; j < m ; ++j) {
            cin >> arr[i][j];
        }
    }
    
    int max_sum = arr[0][0], temp_sum = 0;
    for (int row_len = 1 ; row_len <= n ; row_len++) {
        for (int col_len = 1 ; col_len <= m ; col_len++) {
            for (int i = 0 ; i < n ; ++i) {
                if ( i + row_len > n ) continue;
                for (int j = 0 ; j < m ; ++j) {
					if ( j + col_len > m ) continue;
                    temp_sum = 0;
                    for (int ii = i ; ii < i + row_len ; ++ii) {
                        for (int jj = j ; jj < j + col_len ; ++jj) {
            				temp_sum += arr[ii][jj];     
							cout << arr[ii][jj] << endl;			            
                        }
                    }
                    max_sum = temp_sum > max_sum ? temp_sum : max_sum;
                }
            }
    	}   
    }
    
    cout << max_sum;
    return 0;
}

// 2020/4/10 
// 1. 循环的边界问题 开始 i + row > 0 错写成了 i + row >= 0, 导致1*1 的矩形过不了
// 2. 循环变量的索引问题, 内部循环当然是加内部循环的索引, temp_sum += arr[ii][jj] 开始错写成了 temp_sum += arr[i][j]
// 3. break和continue,这里开始错写成了break,这是不对的,否则检查到第一行超了后后面所有行都不再作为起始点进行搜索 

又重新写了一遍,熟了一些

#include <iostream>
using namespace std;

int arr[50][50];

int main() 
{
    int n, m;
    cin >> n >> m;
    
    for (int i = 0 ; i < n ; ++i) {
        for (int j = 0 ; j < m ; ++j) {
            cin >> arr[i][j];
        }
    } 
    
    int tempsum = 0;
    int maxsum = arr[0][0];
    
    for (int i = 0 ; i < n ; ++i) {
        for (int j = 0 ; j < m ; ++j) {
            // the outer 2 loops decide the anchor point
            // now decide the size of the window size
            for (int rowlen = 0 ; ; ++rowlen) {
                if (rowlen + i >= n) break;
                for (int collen = 0 ; ; ++collen) {
                    if (collen + j >= m) break;
                    // now decided the window size length
                    // begin to calculate the sum of the matrix elements
                    for (int ii = i ; ii <= i + rowlen ; ++ii) {
                        for (int jj = j ; jj <= j + collen ; ++jj) {
                            tempsum += arr[ii][jj];
                        }
                    } 
                    if (tempsum > maxsum) {
                        maxsum = tempsum;
                    }
                    tempsum = 0;
                }
            }
        }
    }
    
    cout << maxsum;
    
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值