网址如下:
OpenJudge - 2766:最大子矩阵

用dp来做就行了
代码如下(MLE):
#include<cstdio>
const int maxn = 101;
int dp[maxn][maxn][maxn][maxn];
int martix[maxn][maxn];
int N, ans;
int main(void)
{
    scanf("%d", &N);
    //输入
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
            scanf("%d", &martix[i][j]);
    //dp
    ans = martix[1][1];
    for(int x1 = 1; x1 <= N; x1++)
        for(int y1 = 1; y1 <= N; y1++)
            for(int x2 = x1; x2 <= N; x2++)
                for(int y2 = y1; y2 <= N; y2++){
                    dp[x1][y1][x2][y2] = dp[x1][y1][x2 - 1][y2] + dp[x1][y1][x2][y2 - 1] - dp[x1][y1][x2 - 1][y2 - 1] + martix[x2][y2];
                    ans = ans > dp[x1][y1][x2][y2] ? ans : dp[x1][y1][x2][y2];
                }
    printf("%d", ans);
    return 0;
} 
虽然内存爆了,但是这个更容易看懂
代码如下(AC):
#include<cstdio>
#include<vector>
const int maxn = 101;
std::vector<std::vector<int>> dp[maxn][maxn];
int martix[maxn][maxn];
int N, ans;
int main(void)
{
    scanf("%d", &N);
    //输入
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
            scanf("%d", &martix[i][j]);
    //dp
    ans = martix[1][1];
    for(int x1 = 1; x1 <= N; x1++)
        for(int y1 = 1; y1 <= N; y1++){
            dp[x1][y1].resize(N - x1 + 2);
            dp[x1][y1][0].resize(N - y1 + 2, 0);
            for(int x2 = 1; x2 <= N - x1 + 1; x2++){
                dp[x1][y1][x2].resize(N - y1 + 2, 0);
                for(int y2 = 1; y2 <= N - y1 + 1; y2++){
                    dp[x1][y1][x2][y2] = dp[x1][y1][x2 - 1][y2] + dp[x1][y1][x2][y2 - 1] - dp[x1][y1][x2 - 1][y2 - 1] + martix[x1 + x2 - 1][y1 + y2 - 1];
                    ans = ans > dp[x1][y1][x2][y2] ? ans : dp[x1][y1][x2][y2];
                }
            }
            dp[x1][y1].clear();
        }
    printf("%d", ans);
    return 0;
} 
这个是把内存压下来的代码,dp公式一样,只不过看起来比较复杂



















