1. 程式人生 > >poj 1050_To the max(需要轉換思維,求一個欄位和最大問題)

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;
}