【语法基础】开垦农田
Time Limit:10000MS Memory Limit:65536K
Case Time Limit:1000MS
Description
何老板买了一块土地,他想在这块土地上开垦出一块矩形的农田。
这块土地可看做由n*n个小方块土地构成,何老板告诉你每小块土地的肥沃值,他希望开垦出一片肥沃值总和最大的矩形农田。
问:这个最大肥沃值总和是多少?
Input
第一行为整数n(1<=n<=100)
接下来是一个由整数构成的n*n的矩阵,数字间以空格间隔,每个数字的范围在-10000到10000之间。
Output
一个整数,表示所求的结果
Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
Sample Output
15
Hint
样例说明,选择的矩形区域如下:
9 2
-4 1
-1 8
Source
最大子矩阵 矩阵专项
#include <stdio.h>
int a[101][101], f[101][101][101];
int max(int a, int b)
{
if(a>b) return a;
return b;
}
int main()
{
int n, i, j, k, ans=-2100000000;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d", &a[i][j]);
a[i][j]+=a[i][j-1];
}
}
for(i=1; i<=n; i++)
{
for(j=i; j<=n; j++)
{
for(k=1; k<=n; k++)
{
f[i][j][k]=a[k][j]-a[k][i-1];
if(f[i][j][k-1]>0) f[i][j][k]+=f[i][j][k-1];
if(f[i][j][k]>ans) ans=f[i][j][k];
}
}
}
printf("%d", ans);
return 0;
}