题目大意:这是一道好题。在《算法导论》这本书里面,有一节是介绍如何求最大子序列的。这道题有点类似,区别是从数组变成了矩阵,求最大子矩阵。
解法:完全没有算法功底的人当然不知道最大子序列这么经典的东西。所以先请教Google。我是参考了这篇文章的,tengpi.blog.163.com/blog/static/22788264200772561412895/。大意就是另开辟一个同样大小的矩阵,每个元素存放自左侧第一列到该元素的和。然后在纵向上用最大子序列的类似方法计算。
参考代码:
/* tengpi.blog.163.com/blog/static/22788264200772561412895/ */ #include<iostream> using namespace std; int main(){ int N,i,j,k,btemp,max=-12700; int A[100][101],B[100][101]; while(cin>>N){ for(i=0;i<N;i++){ B[i][0]=0; for(j=1;j<=N;j++){ cin>>A[i][j]; } } for(i=0;i<N;i++){ btemp=0; for(j=1;j<=N;j++){ btemp+=A[i][j]; B[i][j]=btemp; } } for(i=0;i<N;i++){ for(j=i+1;j<=N;j++){ btemp=0; for(k=0;k<N;k++){ btemp+=B[k][j]-B[k][i]; if(btemp>max)max=btemp; if(btemp<0)btemp=0; } } } cout<<max<<endl; } return 0; }