【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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;
}