题目:http://poj.org/problem?id=1050
大致题意:
给出一个矩阵,求子矩阵中所有元素的和最大的那个值
大致思路:
求最大子段和代码及讲解:http://blog.csdn.net/hh__01/article/details/49205633
运用到求最大子段和的,将二维转换为一维来做
例如求以下矩阵的最大子矩阵元素和:
0 -2 -7 0
9 2 -6 2
当我们把第二行加到第一行时
9 0 -13 2
求出的最大子段为9,则为答案
代码:
#include <iostream>
using namespace std;
int data[101][101];
int temp[101];
int getMax(int n)//用来得到temp此时的最大子段和的值
{
int sum = 0;
int max = 0;
for (int i = 1; i <= n; i++)
{
if (sum < 0)
{
sum = temp[i];
}
else
{
sum += temp[i];
}
if (max < sum)
{
max = sum;
}
}
return max;
}
int main()
{
int n;
int max;//用来记录每行最大子段中最大的
int sum;//用来求和,判断是否加到负数
while (scanf("%d", &n) != EOF)
{
max = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &data[i][j]);
}
}
for (int i = 1; i <= n; i++)
{
sum = 0;
for (int j = 1; j <= n; j++)
{
temp[j] = 0;
}
for (int j = i; j <= n; j++)
{
//将第i行的数据都放入temp求最大子段的和,再将i+1和第i行对应的元素加起来都放入temp求
//最大子段的和,直到加到最后一行,这样把多维转化为一维来求最大子段和
for (int k = 1; k <= n; k++)
{
temp[k] += data[j][k];
}
sum = getMax(n);
if (max < sum)
{
max = sum;
}
}
}
printf("%d", max);
}
return 0;
}