poj 1050_To the max(需要转换思维,求一个字段和最大问题)

分析:  对于此题,首先可以想到的有前缀和,这个题的关键也是前缀和,但是怎么设计这个前缀和是一个好问题。

          通常我们所用的前缀和大多都是在一维数组上,可以通过一维数组中的前缀和来求得在一维数组上求一个字段,且使字段的和最大这个问题。推广到二维数组,二维数组中记录的是所在列的前缀和(一定要参照代码理解)。然后通过和一维数组求最大和字段类似的方法,延伸到二维数组(从列上可以直观的看出)。

          

#include <iostream>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int res[105][105];  //res数组中记录的是列上的前缀和  用的非常好,很值得学习

int main()
{
    memset(res,0,sizeof res);
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int t;cin>>t;
            res[i][j]=res[i-1][j]+t;  //仔细看实现过程 很重要
        }
    }
    int sum=0,maxa=-inf;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            sum=0;
            for(int k=1;k<=n;k++)
            {
                sum+=res[j][k]-res[i-1][k];
                if(sum<0) sum=0;
                maxa=max(sum,maxa);
            }
        }
    }
    cout<<maxa<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35937273/article/details/82799942