您的位置:首页 > 其它

POJ 1050 二维子数组最大值

2012-12-01 13:59 288 查看
//11068092	c00h00g	1050	Accepted	4736K	47MS	C++	1140B	2012-12-01 13:59:06
//参考的编程之美上给出解法
//收获:对于一维的数组a[i],要求其最大连续子串和,我们只需要设计一个变量tmp=0(初值)
//for(int i=1;i<=n;i++){
//  tmp=max(tmp+a[i],a[i])
// }而不需要设计dp[i] 
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<string.h>
#include<algorithm>
using namespace std;

int N;
int mat[105][105];
//用于记录某列的第i行到第j行的和 
int sum_col[105][105][105];

int main(){
    while(scanf("%d",&N)!=EOF){
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++){
                 scanf("%d",&mat[i][j]);
            }
        //对第i列来说,求第j行到第k行的和 
        memset(sum_col,0,sizeof(sum_col));
        //预处理 
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                for(int k=j;k<=N;k++){
                    for(int m=j;m<=k;m++)
                        sum_col[i][j][k]+=mat[m][i];
                }
            }
        }
        //
        int res=-INT_MAX;
        for(int i=1;i<=N;i++){
           for(int j=i;j<=N;j++){
               //对每一列来说
               int tmp=0;
               for(int k=1;k<=N;k++){
                   tmp=max(tmp+sum_col[k][i][j],sum_col[k][i][j]);
                   res=max(res,tmp);
               } 
           }
        } 
        printf("%d\n",res);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: