HDU

来源:互联网 发布:直播看电视的软件 编辑:程序博客网 时间:2024/06/05 01:08

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1081

题目大意:求最大的子矩阵和

解题思路:思路与求最大连续子序列和一样,只不过这里要对两列进行枚举,然后把这两列每一行的数字和看成一个数字,从第一行开始扫到最后一行,那么就是求最大连续子序列了

AC代码:

#include<cstdio>using namespace std;const int MAXN = 10000 + 5;const int INF = 0x3f3f3f3f;int sum[MAXN][MAXN];int main(){    for (int n;scanf("%d", &n) == 1;)    {        for (int i = 1;i <= n;i++)            for (int j = 1;j <= n;j++)                scanf("%d", &sum[i][j]);        for (int i = 1;i <= n;i++)            for (int j = 1;j <= n;j++)                sum[i][j] += sum[i][j - 1];        int mxxsum = -INF;        int ansi1, ansj1, ansi2, ansj2, starti, startj;        for (int i = 1;i <= n;i++)            for (int j = i;j <= n;j++)            {                int presum = -INF;                for (int k = 1;k <= n;k++)                {                    if (presum < 0)                    {                        presum = 0;                        starti = k;                        startj = i;                    }                    presum += sum[k][j] - sum[k][i - 1];                    if (presum > mxxsum)                    {                        ansi1 = starti;                        ansj1 = startj;                        ansi2 = k;                        ansj2 = j;                        mxxsum = presum;                    }                }            }        printf("%d\n", mxxsum);    }    return 0;}
原创粉丝点击