题目链接:http://poj.org/problem?id=1050
题目大意:求一个最大为100*100矩阵中的子矩阵中元素之和的最大值。

枚举此子矩阵是第i行到第j行。然后压成一维dp最大子段和。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;

//memset(a, 0, sizeof(a));
//stack堆栈 queue队列 priority_queue优先队列
//vector向量 multiset平衡二叉树 deque双端队列
//pair{T1 first;T2 second;} greater<T>
//unordered_map 哈希map

int m[105][105];
int s[105][105];

int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        memset(s[0], 0, sizeof(s[0]));

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&m[i][j]);
                s[i][j]=s[i-1][j]+m[i][j];
            }
        }

        int MAX=-1000;
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                int dp[105]={0};
                for(int k=1;k<=n;k++)
                {
                    int x=s[j][k]-s[i-1][k];
                    dp[k]=max(dp[k-1]+x, x);
                    MAX=max(MAX, dp[k]);
                }
            }
        }
        cout<<MAX<<endl;

    }

    return 0;
}