题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081
解题报告:求最大的矩阵和的问题,可以转化为最大连续子序列和的模型,只不过这个是一个二维的问题。如何转化是关键:我们可以把每一项变成前面多项的和,通过相减计算每个子矩阵。在求解的时候竖着求解,这样子问题就转换为1维求解最大连续子序列和的问题。
给一组参考数据:
4
-3 -7 -1 -2
-3 -4 -2 -5
-3 -5 -2 -3
-4 6 -3 -2
参考代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAX (100 + 5) int mp[MAX][MAX],sum[MAX][MAX]; int temp[MAX][MAX]; int main() { int n,ans,cnt; while(scanf("%d",&n)!=EOF) { int mini = -0x7ffffff; memset(mp,0,sizeof(mp)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&mp[i][j]); if(mp[i][j] > mini) mini = mp[i][j]; } if(mini<0) { printf("%d\n",mini); continue; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) sum[i][j]=sum[i][j-1]+mp[i][j]; } ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=0;k<i;k++) { temp[j][k+1]=sum[j][i]-sum[j][k]; } } for(int k=1;k<=i;k++) { cnt=0; for(int j=1;j<=n;j++) { cnt+=temp[j][k]; if(ans<cnt) ans=cnt; if(cnt<0) cnt=0; } } } printf("%d\n",ans); } return 0; }