题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74
http://poj.org/problem?id=1050
解题报告:
1、用b[i]来记录某一行到第i行的某一列的和。
2、用b[k]=b[k]+a[j][k]来更新。
3、用sum=sum+b[k]来记录第i行到下面的那一行的那个矩阵的和(列数变化)。
4、if(sum<b[k])表示第k列之前的矩阵为负,最大和就为sum=b[k];
5、更新max。
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int Max=-0x3f3f3f3f;///最优值 int a[105][105];///存储矩阵 int b[105];///b[i],表示之前的某一行到第i行的矩阵和 int main() { int n; int i,j,k; scanf("%d",&n); for(i=0;i<n;i++)///输入矩阵 { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<n;i++)///开始从第0行往下走 { memset(b,0,sizeof(b)); for(j=i;j<n;j++)///开始从i行往下走 { int sum=0;///i~j行的矩阵和(列数不断变化) for(k=0;k<n;k++) { b[k]=b[k]+a[j][k]; sum=sum+b[k]; if(sum<b[k]) sum=b[k];///第k列之前为负,则最大和sum=b[k]; if(sum>Max) Max=sum; } } } printf("%d\n",Max); return 0; }
时间: 2024-10-10 12:46:59