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;}
阅读全文
0 0