hdu 1081 To The Max (简单题)....

来源:互联网 发布:网络专供和专柜 编辑:程序博客网 时间:2024/05/16 12:31

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1081

  • 题意:
    给定一个 n*n 的矩阵, 求其中和最大的子矩阵

  • 思路:
    读入时预处理出前缀和(a[i][j] = sum(in[0..i][j])), o(n^2)枚举行数可能, o(n) 求出当前可能的最大子矩阵. (开始以为是什么高深的压缩技巧, 后来才发现就是暴力枚举…….)

#include <stdio.h>#include <iostream>#include <cstring>using namespace std;const int MAX = 111;const int INF = 1 << 20 -1;int n, ary[MAX][MAX], tary[MAX], ans, tans, tmp;int main() {    while (cin >> n) {//init        ans = -INF;//getin        for (int i = 1; i <= n; ++i)            for (int j = 0; j < n; ++j) {                cin >> ary[i][j];                ary[i][j] += ary[i-1][j];            }//judge        for (int i = 0; i < n; ++i) {            for (int j = i+1; j <= n; ++j) {                tans = -INF, tmp = 0;                for (int k = 0; k < n; ++k) {                    tmp += ary[j][k] - ary[i][k];                    if (tmp > tans)                        tans = tmp;                    else if (tmp < 0)                         tmp = 0;                }                ans = ans > tans ? ans : tans;            }        }        cout << ans << endl;    }    return 0;}

2017-10-13 划水日常

原创粉丝点击