ACM 1050 To the Max http://acm.pku.cn/JudgeOnline/problem?id=1050
这里我重新整理了一下最大子矩阵的算法;
基本思路是将二维数组转化为一维数组,多次调用最大子段和函数,通过比较获得最大值;我画一个图吧;
每次将二维数组的每列和转为一维数组;调用一维数组最大最大子段和问题;用temp存储最大值就欧了!!!总之一句话:会最大字段和这个问题就很容易看懂!我也不多写了,代码贴一下:
#include <iostream> using namespace std; int array[105][105],n,s[105]; int maxSum(int n,int *a) { int sum=a[0],b=0; for(int i=0;i!=n;++i) { if (b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return sum; } int solve() { int sum=-128,i,j,k,temp; for(i=0;i!=n;++i) { for(j=0;j!=n;++j) s[j]=0; for(j=i;j!=n;++j) { for(k=0;k!=n;++k) s[k]+=array[j][k]; temp=maxSum(n,s); if(temp>sum) sum=temp; } } return sum; } int main() { cin>>n; for(int i=0; i!=n; ++i) for(int j=0; j!=n; ++j) cin>>array[i][j]; cout<<solve(); return 0; }