开始也没思路,参考了网上别人的思路
题目大意:
给定一个N*N的矩阵,求出一个子矩阵(最小为1*1,最大为N*N),使得该子矩阵中的元素和最大,输出最大的和。
解题思路:
子矩阵最小为1行,最大为N行,将原矩阵子矩阵(最小为1行,最大为N行)压缩成一个一维数组,问题转换为求一维数组的子序列最大和,记录最大值。
#include<stdio.h>
int array[100][100];
int s[100];
int n;
int max_seq_sum(int *a) //求数组子序列的最大和
{
int temp,max,i;
temp=a[0];
max=-(1<<30);
for(i=1; i<n; i++)
{
if(temp<0) temp=a[i];
else temp+=a[i];
if(max<temp) max=temp;
}
return max;
}
int main()
{
int i,j,k,max,temp;
max= -(1<<30);
//输入数据
scanf("%d", &n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d", &array[i][j]);
for(i=0; i<n; i++) //i代表开始行
{
memset(s, 0, sizeof(s));
for(j=i; j<n; j++) //j代表结束行
{
//将i行到j行压缩为一维数组
for(k=0; k<n; k++)
s[k] += array[j][k];
//计算压缩后数组的子序列最大和
temp = max_seq_sum(s);
if(temp>max) max=temp;
}
}
printf("%d\n", max);
return 0;
}