动态规划1282:最大子矩阵(语言-c++)

【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 × 1)子矩阵。

比如,如下4 × 4的矩阵

0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是

9 2
-4 1
-1 8
这个子矩阵的大小是15。

【输入】
输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。

【输出】
输出最大子矩阵的大小。

【输入样例】
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
【输出样例】
15
我想用动态规划的方法做,但是只过了3个点:

#include<iostream>
using namespace std;
int n,a[110][110];//定义边长n和矩阵a 
int b[110];
int dp[110];
const int MIN=(10001*-128);
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];//输入矩阵 
        }
    }
    int ma=MIN;//ma先设为最小值 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            b[j]+=a[i][j];//将a的第i行加给b 
        }
        dp[1]=b[1];//将dp的第一项赋值为b的第一项 
        int mx=dp[1];
        for(int j=2;j<=n;j++){
            dp[j]=max(b[j],dp[j-1]+b[j]);
            if(dp[j]>mx)mx=dp[j];
        }
        if(mx>ma)ma=mx;
    }
    for(int i=1;i<n;i++){//最后一行不能删去 
        for(int j=1;j<=n;j++){
            b[j]-=a[i][j];//将a的第i行从b中删去 
        }
        dp[1]=b[1];
        int mx=MIN;
        for(int j=2;j<=n;j++){
            dp[j]=max(b[j],dp[j-1]+b[j]);
            if(dp[j]>mx)mx=dp[j];
        }
        if(mx>ma)ma=mx;
    }
    cout<<ma;//输出答案 
    return 0;
}